/*
 Highcharts JS v3.0.2 (2013-06-05)

 (c) 2009-2013 Torstein Hønsi

 License: www.highcharts.com/license
*/
(function() {
	function v(a, b) {
		var c;
		a || (a = {});
		for (c in b) a[c] = b[c];
		return a
	}

	function x() {
		var a, b = arguments.length,
			c = {},
			d = function(a, b) {
				var c, h;
				for (h in b) b.hasOwnProperty(h) && (c = b[h], typeof a !== "object" && (a = {}), a[h] = c && typeof c === "object" && Object.prototype.toString.call(c) !== "[object Array]" && typeof c.nodeType !== "number" ? d(a[h] || {}, c) : b[h]);
				return a
			};
		for (a = 0; a < b; a++) c = d(c, arguments[a]);
		return c
	}

	function u(a, b) {
		return parseInt(a, b || 10)
	}

	function fa(a) {
		return typeof a === "string"
	}

	function V(a) {
		return typeof a ===
			"object"
	}

	function Da(a) {
		return Object.prototype.toString.call(a) === "[object Array]"
	}

	function Ea(a) {
		return typeof a === "number"
	}

	function ka(a) {
		return I.log(a) / I.LN10
	}

	function da(a) {
		return I.pow(10, a)
	}

	function ga(a, b) {
		for (var c = a.length; c--;)
			if (a[c] === b) {
				a.splice(c, 1);
				break
			}
	}

	function r(a) {
		return a !== y && a !== null
	}

	function A(a, b, c) {
		var d, e;
		if (fa(b)) r(c) ? a.setAttribute(b, c) : a && a.getAttribute && (e = a.getAttribute(b));
		else if (r(b) && V(b))
			for (d in b) a.setAttribute(d, b[d]);
		return e
	}

	function ha(a) {
		return Da(a) ?
			a : [a]
	}

	function o() {
		var a = arguments,
			b, c, d = a.length;
		for (b = 0; b < d; b++)
			if (c = a[b], typeof c !== "undefined" && c !== null) return c
	}

	function L(a, b) {
		if (Fa && b && b.opacity !== y) b.filter = "alpha(opacity=" + b.opacity * 100 + ")";
		v(a.style, b)
	}

	function U(a, b, c, d, e) {
		a = z.createElement(a);
		b && v(a, b);
		e && L(a, {
			padding: 0,
			border: S,
			margin: 0
		});
		c && L(a, c);
		d && d.appendChild(a);
		return a
	}

	function ea(a, b) {
		var c = function() {};
		c.prototype = new a;
		v(c.prototype, b);
		return c
	}

	function ua(a, b, c, d) {
		var e = N.lang,
			f = b === -1 ? ((a || 0).toString().split(".")[1] ||
				"").length : isNaN(b = Q(b)) ? 2 : b,
			b = c === void 0 ? e.decimalPoint : c,
			d = d === void 0 ? e.thousandsSep : d,
			e = a < 0 ? "-" : "",
			c = String(u(a = Q(+a || 0).toFixed(f))),
			g = c.length > 3 ? c.length % 3 : 0;
		return e + (g ? c.substr(0, g) + d : "") + c.substr(g).replace(/(\d{3})(?=\d)/g, "$1" + d) + (f ? b + Q(a - c).toFixed(f).slice(2) : "")
	}

	function va(a, b) {
		return Array((b || 2) + 1 - String(a).length).join(0) + a
	}

	function zb(a, b, c) {
		var d = a[b];
		a[b] = function() {
			var a = Array.prototype.slice.call(arguments);
			a.unshift(d);
			return c.apply(this, a)
		}
	}

	function wa(a, b) {
		for (var c = "{",
				d = !1, e, f, g, h, i, j = [];
			(c = a.indexOf(c)) !== -1;) {
			e = a.slice(0, c);
			if (d) {
				f = e.split(":");
				g = f.shift().split(".");
				i = g.length;
				e = b;
				for (h = 0; h < i; h++) e = e[g[h]];
				if (f.length) f = f.join(":"), g = /\.([0-9])/, h = N.lang, i = void 0, /f$/.test(f) ? (i = (i = f.match(g)) ? i[1] : -1, e = ua(e, i, h.decimalPoint, f.indexOf(",") > -1 ? h.thousandsSep : "")) : e = Ua(f, e)
			}
			j.push(e);
			a = a.slice(c + 1);
			c = (d = !d) ? "}" : "{"
		}
		j.push(a);
		return j.join("")
	}

	function ib(a, b, c, d) {
		var e, c = o(c, 1);
		e = a / c;
		b || (b = [1, 2, 2.5, 5, 10], d && d.allowDecimals === !1 && (c === 1 ? b = [1, 2, 5, 10] : c <= 0.1 && (b = [1 / c])));
		for (d = 0; d < b.length; d++)
			if (a = b[d], e <= (b[d] + (b[d + 1] || b[d])) / 2) break;
		a *= c;
		return a
	}

	function Ab(a, b) {
		var c = b || [
				[Bb, [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]],
				[jb, [1, 2, 5, 10, 15, 30]],
				[Va, [1, 2, 5, 10, 15, 30]],
				[Oa, [1, 2, 3, 4, 6, 8, 12]],
				[oa, [1, 2]],
				[Wa, [1, 2]],
				[Pa, [1, 2, 3, 4, 6]],
				[xa, null]
			],
			d = c[c.length - 1],
			e = E[d[0]],
			f = d[1],
			g;
		for (g = 0; g < c.length; g++)
			if (d = c[g], e = E[d[0]], f = d[1], c[g + 1] && a <= (e * f[f.length - 1] + E[c[g + 1][0]]) / 2) break;
		e === E[xa] && a < 5 * e && (f = [1, 2, 5]);
		e === E[xa] && a < 5 * e && (f = [1, 2, 5]);
		c = ib(a / e, f);
		return {
			unitRange: e,
			count: c,
			unitName: d[0]
		}
	}

	function Cb(a, b, c, d) {
		var e = [],
			f = {},
			g = N.global.useUTC,
			h, i = new Date(b),
			j = a.unitRange,
			k = a.count;
		if (r(b)) {
			j >= E[jb] && (i.setMilliseconds(0), i.setSeconds(j >= E[Va] ? 0 : k * T(i.getSeconds() / k)));
			if (j >= E[Va]) i[Db](j >= E[Oa] ? 0 : k * T(i[kb]() / k));
			if (j >= E[Oa]) i[Eb](j >= E[oa] ? 0 : k * T(i[lb]() / k));
			if (j >= E[oa]) i[mb](j >= E[Pa] ? 1 : k * T(i[Qa]() / k));
			j >= E[Pa] && (i[Fb](j >= E[xa] ? 0 : k * T(i[Xa]() / k)), h = i[Ya]());
			j >= E[xa] && (h -= h % k, i[Gb](h));
			if (j === E[Wa]) i[mb](i[Qa]() - i[nb]() + o(d, 1));
			b = 1;
			h = i[Ya]();
			for (var d = i.getTime(), m = i[Xa](),
				l = i[Qa](), p = g ? 0 : (864E5 + i.getTimezoneOffset() * 6E4) % 864E5; d < c;) e.push(d), j === E[xa] ? d = Za(h + b * k, 0) : j === E[Pa] ? d = Za(h, m + b * k) : !g && (j === E[oa] || j === E[Wa]) ? d = Za(h, m, l + b * k * (j === E[oa] ? 1 : 7)) : d += j * k, b++;
			e.push(d);
			n(ob(e, function(a) {
				return j <= E[Oa] && a % E[oa] === p
			}), function(a) {
				f[a] = oa
			})
		}
		e.info = v(a, {
			higherRanks: f,
			totalRange: j * k
		});
		return e
	}

	function Hb() {
		this.symbol = this.color = 0
	}

	function Ib(a, b) {
		var c = a.length,
			d, e;
		for (e = 0; e < c; e++) a[e].ss_i = e;
		a.sort(function(a, c) {
			d = b(a, c);
			return d === 0 ? a.ss_i - c.ss_i : d
		});
		for (e = 0; e < c; e++) delete a[e].ss_i
	}

	function Ga(a) {
		for (var b = a.length, c = a[0]; b--;) a[b] < c && (c = a[b]);
		return c
	}

	function pa(a) {
		for (var b = a.length, c = a[0]; b--;) a[b] > c && (c = a[b]);
		return c
	}

	function Ha(a, b) {
		for (var c in a) a[c] && a[c] !== b && a[c].destroy && a[c].destroy(), delete a[c]
	}

	function Ra(a) {
		$a || ($a = U(ya));
		a && $a.appendChild(a);
		$a.innerHTML = ""
	}

	function qa(a, b) {
		var c = "Highcharts error #" + a + ": www.highcharts.com/errors/" + a;
		if (b) throw c;
		else O.console && console.log(c)
	}

	function ia(a) {
		return parseFloat(a.toPrecision(14))
	}

	function Ia(a, b) {
		za = o(a, b.animation)
	}

	function Jb() {
		var a = N.global.useUTC,
			b = a ? "getUTC" : "get",
			c = a ? "setUTC" : "set";
		Za = a ? Date.UTC : function(a, b, c, g, h, i) {
			return (new Date(a, b, o(c, 1), o(g, 0), o(h, 0), o(i, 0))).getTime()
		};
		kb = b + "Minutes";
		lb = b + "Hours";
		nb = b + "Day";
		Qa = b + "Date";
		Xa = b + "Month";
		Ya = b + "FullYear";
		Db = c + "Minutes";
		Eb = c + "Hours";
		mb = c + "Date";
		Fb = c + "Month";
		Gb = c + "FullYear"
	}

	function ra() {}

	function Ja(a, b, c, d) {
		this.axis = a;
		this.pos = b;
		this.type = c || "";
		this.isNew = !0;
		!c && !d && this.addLabel()
	}

	function pb(a, b) {
		this.axis = a;
		if (b) this.options = b, this.id = b.id
	}

	function Kb(a,
		b, c, d, e, f) {
		var g = a.chart.inverted;
		this.axis = a;
		this.isNegative = c;
		this.options = b;
		this.x = d;
		this.stack = e;
		this.percent = f === "percent";
		this.alignOptions = {
			align: b.align || (g ? c ? "left" : "right" : "center"),
			verticalAlign: b.verticalAlign || (g ? "middle" : c ? "bottom" : "top"),
			y: o(b.y, g ? 4 : c ? 14 : -6),
			x: o(b.x, g ? c ? -6 : 6 : 0)
		};
		this.textAlign = b.textAlign || (g ? c ? "right" : "left" : "center")
	}

	function ab() {
		this.init.apply(this, arguments)
	}

	function qb() {
		this.init.apply(this, arguments)
	}

	function rb(a, b) {
		this.init(a, b)
	}

	function sb(a, b) {
		this.init(a,
			b)
	}

	function tb() {
		this.init.apply(this, arguments)
	}
	var y, z = document,
		O = window,
		I = Math,
		t = I.round,
		T = I.floor,
		ja = I.ceil,
		q = I.max,
		K = I.min,
		Q = I.abs,
		Y = I.cos,
		ca = I.sin,
		Ka = I.PI,
		bb = Ka * 2 / 360,
		Aa = navigator.userAgent,
		Lb = O.opera,
		Fa = /msie/i.test(Aa) && !Lb,
		cb = z.documentMode === 8,
		db = /AppleWebKit/.test(Aa),
		eb = /Firefox/.test(Aa),
		Mb = /(Mobile|Android|Windows Phone)/.test(Aa),
		sa = "http://www.w3.org/2000/svg",
		Z = !!z.createElementNS && !!z.createElementNS(sa, "svg").createSVGRect,
		Sb = eb && parseInt(Aa.split("Firefox/")[1], 10) < 4,
		$ = !Z && !Fa &&
		!!z.createElement("canvas").getContext,
		Sa, fb = z.documentElement.ontouchstart !== y,
		Nb = {},
		ub = 0,
		$a, N, Ua, za, vb, E, ta = function() {},
		Ba = [],
		ya = "div",
		S = "none",
		Ob = "rgba(192,192,192," + (Z ? 1.0E-4 : 0.002) + ")",
		Bb = "millisecond",
		jb = "second",
		Va = "minute",
		Oa = "hour",
		oa = "day",
		Wa = "week",
		Pa = "month",
		xa = "year",
		Pb = "stroke-width",
		Za, kb, lb, nb, Qa, Xa, Ya, Db, Eb, mb, Fb, Gb, aa = {};
	O.Highcharts = O.Highcharts ? qa(16, !0) : {};
	Ua = function(a, b, c) {
		if (!r(b) || isNaN(b)) return "Invalid date";
		var a = o(a, "%Y-%m-%d %H:%M:%S"),
			d = new Date(b),
			e, f = d[lb](),
			g = d[nb](),
			h = d[Qa](),
			i = d[Xa](),
			j = d[Ya](),
			k = N.lang,
			m = k.weekdays,
			d = v({
				a: m[g].substr(0, 3),
				A: m[g],
				d: va(h),
				e: h,
				b: k.shortMonths[i],
				B: k.months[i],
				m: va(i + 1),
				y: j.toString().substr(2, 2),
				Y: j,
				H: va(f),
				I: va(f % 12 || 12),
				l: f % 12 || 12,
				M: va(d[kb]()),
				p: f < 12 ? "AM" : "PM",
				P: f < 12 ? "am" : "pm",
				S: va(d.getSeconds()),
				L: va(t(b % 1E3), 3)
			}, Highcharts.dateFormats);
		for (e in d)
			for (; a.indexOf("%" + e) !== -1;) a = a.replace("%" + e, typeof d[e] === "function" ? d[e](b) : d[e]);
		return c ? a.substr(0, 1).toUpperCase() + a.substr(1) : a
	};
	Hb.prototype = {
		wrapColor: function(a) {
			if (this.color >=
				a) this.color = 0
		},
		wrapSymbol: function(a) {
			if (this.symbol >= a) this.symbol = 0
		}
	};
	E = function() {
		for (var a = 0, b = arguments, c = b.length, d = {}; a < c; a++) d[b[a++]] = b[a];
		return d
	}(Bb, 1, jb, 1E3, Va, 6E4, Oa, 36E5, oa, 864E5, Wa, 6048E5, Pa, 26784E5, xa, 31556952E3);
	vb = {
		init: function(a, b, c) {
			var b = b || "",
				d = a.shift,
				e = b.indexOf("C") > -1,
				f = e ? 7 : 3,
				g, b = b.split(" "),
				c = [].concat(c),
				h, i, j = function(a) {
					for (g = a.length; g--;) a[g] === "M" && a.splice(g + 1, 0, a[g + 1], a[g + 2], a[g + 1], a[g + 2])
				};
			e && (j(b), j(c));
			a.isArea && (h = b.splice(b.length - 6, 6), i = c.splice(c.length -
				6, 6));
			if (d <= c.length / f)
				for (; d--;) c = [].concat(c).splice(0, f).concat(c);
			a.shift = 0;
			if (b.length)
				for (a = c.length; b.length < a;) d = [].concat(b).splice(b.length - f, f), e && (d[f - 6] = d[f - 2], d[f - 5] = d[f - 1]), b = b.concat(d);
			h && (b = b.concat(h), c = c.concat(i));
			return [b, c]
		},
		step: function(a, b, c, d) {
			var e = [],
				f = a.length;
			if (c === 1) e = d;
			else if (f === b.length && c < 1)
				for (; f--;) d = parseFloat(a[f]), e[f] = isNaN(d) ? a[f] : c * parseFloat(b[f] - d) + d;
			else e = b;
			return e
		}
	};
	(function(a) {
		O.HighchartsAdapter = O.HighchartsAdapter || a && {
			init: function(b) {
				var c =
					a.fx,
					d = c.step,
					e, f = a.Tween,
					g = f && f.propHooks;
				e = a.cssHooks.opacity;
				a.extend(a.easing, {
					easeOutQuad: function(a, b, c, d, e) {
						return -d * (b /= e) * (b - 2) + c
					}
				});
				a.each(["cur", "_default", "width", "height", "opacity"], function(a, b) {
					var e = d,
						k, m;
					b === "cur" ? e = c.prototype : b === "_default" && f && (e = g[b], b = "set");
					(k = e[b]) && (e[b] = function(c) {
						c = a ? c : this;
						m = c.elem;
						return m.attr ? m.attr(c.prop, b === "cur" ? y : c.now) : k.apply(this, arguments)
					})
				});
				zb(e, "get", function(a, b, c) {
					return b.attr ? b.opacity || 0 : a.call(this, b, c)
				});
				e = function(a) {
					var c = a.elem,
						d;
					if (!a.started) d = b.init(c, c.d, c.toD), a.start = d[0], a.end = d[1], a.started = !0;
					c.attr("d", b.step(a.start, a.end, a.pos, c.toD))
				};
				f ? g.d = {
					set: e
				} : d.d = e;
				this.each = Array.prototype.forEach ? function(a, b) {
					return Array.prototype.forEach.call(a, b)
				} : function(a, b) {
					for (var c = 0, d = a.length; c < d; c++)
						if (b.call(a[c], a[c], c, a) === !1) return c
				};
				a.fn.highcharts = function() {
					var a = "Chart",
						b = arguments,
						c, d;
					fa(b[0]) && (a = b[0], b = Array.prototype.slice.call(b, 1));
					c = b[0];
					if (c !== y) c.chart = c.chart || {}, c.chart.renderTo = this[0], new Highcharts[a](c,
						b[1]), d = this;
					c === y && (d = Ba[A(this[0], "data-highcharts-chart")]);
					return d
				}
			},
			getScript: a.getScript,
			inArray: a.inArray,
			adapterRun: function(b, c) {
				return a(b)[c]()
			},
			grep: a.grep,
			map: function(a, c) {
				for (var d = [], e = 0, f = a.length; e < f; e++) d[e] = c.call(a[e], a[e], e, a);
				return d
			},
			offset: function(b) {
				return a(b).offset()
			},
			addEvent: function(b, c, d) {
				a(b).bind(c, d)
			},
			removeEvent: function(b, c, d) {
				var e = z.removeEventListener ? "removeEventListener" : "detachEvent";
				z[e] && b && !b[e] && (b[e] = function() {});
				a(b).unbind(c, d)
			},
			fireEvent: function(b,
				c, d, e) {
				var f = a.Event(c),
					g = "detached" + c,
					h;
				!Fa && d && (delete d.layerX, delete d.layerY);
				v(f, d);
				b[c] && (b[g] = b[c], b[c] = null);
				a.each(["preventDefault", "stopPropagation"], function(a, b) {
					var c = f[b];
					f[b] = function() {
						try {
							c.call(f)
						} catch (a) {
							b === "preventDefault" && (h = !0)
						}
					}
				});
				a(b).trigger(f);
				b[g] && (b[c] = b[g], b[g] = null);
				e && !f.isDefaultPrevented() && !h && e(f)
			},
			washMouseEvent: function(a) {
				var c = a.originalEvent || a;
				if (c.pageX === y) c.pageX = a.pageX, c.pageY = a.pageY;
				return c
			},
			animate: function(b, c, d) {
				var e = a(b);
				if (!b.style) b.style = {};
				if (c.d) b.toD = c.d, c.d = 1;
				e.stop();
				e.animate(c, d)
			},
			stop: function(b) {
				a(b).stop()
			}
		}
	})(O.jQuery);
	var W = O.HighchartsAdapter,
		M = W || {};
	W && W.init.call(W, vb);
	var gb = M.adapterRun,
		Tb = M.getScript,
		la = M.inArray,
		n = M.each,
		ob = M.grep,
		Ub = M.offset,
		La = M.map,
		J = M.addEvent,
		ba = M.removeEvent,
		D = M.fireEvent,
		Qb = M.washMouseEvent,
		wb = M.animate,
		Ta = M.stop,
		M = {
			enabled: !0,
			align: "center",
			x: 0,
			y: 15,
			style: {
				color: "#666",
				cursor: "default",
				fontSize: "11px",
				lineHeight: "14px"
			}
		};
	N = {
		colors: "#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),
		symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
		lang: {
			loading: "Loading...",
			months: "January,February,March,April,May,June,July,August,September,October,November,December".split(","),
			shortMonths: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),
			weekdays: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),
			decimalPoint: ".",
			numericSymbols: "k,M,G,T,P,E".split(","),
			resetZoom: "Reset zoom",
			resetZoomTitle: "Reset zoom level 1:1",
			thousandsSep: ","
		},
		global: {
			useUTC: !0,
			canvasToolsURL: "http://code.highcharts.com/3.0.2/modules/canvas-tools.js",
			VMLRadialGradientURL: "http://code.highcharts.com/3.0.2/gfx/vml-radial-gradient.png"
		},
		chart: {
			borderColor: "#4572A7",
			borderRadius: 5,
			defaultSeriesType: "line",
			ignoreHiddenSeries: !0,
			spacingTop: 10,
			spacingRight: 10,
			spacingBottom: 15,
			spacingLeft: 10,
			style: {
				fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',
				fontSize: "12px"
			},
			backgroundColor: "#FFFFFF",
			plotBorderColor: "#C0C0C0",
			resetZoomButton: {
				theme: {
					zIndex: 20
				},
				position: {
					align: "right",
					x: -10,
					y: 10
				}
			}
		},
		title: {
			text: "Chart title",
			align: "center",
			y: 15,
			style: {
				color: "#274b6d",
				fontSize: "16px"
			}
		},
		subtitle: {
			text: "",
			align: "center",
			y: 30,
			style: {
				color: "#4d759e"
			}
		},
		plotOptions: {
			line: {
				allowPointSelect: !1,
				showCheckbox: !1,
				animation: {
					duration: 1E3
				},
				events: {},
				lineWidth: 2,
				marker: {
					enabled: !0,
					lineWidth: 0,
					radius: 4,
					lineColor: "#FFFFFF",
					states: {
						hover: {
							enabled: !0
						},
						select: {
							fillColor: "#FFFFFF",
							lineColor: "#000000",
							lineWidth: 2
						}
					}
				},
				point: {
					events: {}
				},
				dataLabels: x(M, {
					enabled: !1,
					formatter: function() {
						return ua(this.y, -1)
					},
					verticalAlign: "bottom",
					y: 0
				}),
				cropThreshold: 300,
				pointRange: 0,
				showInLegend: !0,
				states: {
					hover: {
						marker: {}
					},
					select: {
						marker: {}
					}
				},
				stickyTracking: !0
			}
		},
		labels: {
			style: {
				position: "absolute",
				color: "#3E576F"
			}
		},
		legend: {
			enabled: !0,
			align: "center",
			layout: "horizontal",
			labelFormatter: function() {
				return this.name
			},
			borderWidth: 1,
			borderColor: "#909090",
			borderRadius: 5,
			navigation: {
				activeColor: "#274b6d",
				inactiveColor: "#CCC"
			},
			shadow: !1,
			itemStyle: {
				cursor: "pointer",
				color: "#274b6d",
				fontSize: "12px"
			},
			itemHoverStyle: {
				color: "#000"
			},
			itemHiddenStyle: {
				color: "#CCC"
			},
			itemCheckboxStyle: {
				position: "absolute",
				width: "13px",
				height: "13px"
			},
			symbolWidth: 16,
			symbolPadding: 5,
			verticalAlign: "bottom",
			x: 0,
			y: 0,
			title: {
				style: {
					fontWeight: "bold"
				}
			}
		},
		loading: {
			labelStyle: {
				fontWeight: "bold",
				position: "relative",
				top: "1em"
			},
			style: {
				position: "absolute",
				backgroundColor: "white",
				opacity: 0.5,
				textAlign: "center"
			}
		},
		tooltip: {
			enabled: !0,
			animation: Z,
			backgroundColor: "rgba(255, 255, 255, .85)",
			borderWidth: 1,
			borderRadius: 3,
			dateTimeLabelFormats: {
				millisecond: "%A, %b %e, %H:%M:%S.%L",
				second: "%A, %b %e, %H:%M:%S",
				minute: "%A, %b %e, %H:%M",
				hour: "%A, %b %e, %H:%M",
				day: "%A, %b %e, %Y",
				week: "Week from %A, %b %e, %Y",
				month: "%B %Y",
				year: "%Y"
			},
			headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
			pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',
			shadow: !0,
			snap: Mb ? 25 : 10,
			style: {
				color: "#333333",
				cursor: "default",
				fontSize: "12px",
				padding: "8px",
				whiteSpace: "nowrap"
			}
		},
		credits: {
			enabled: !0,
			text: "Highcharts.com",
			href: "http://www.highcharts.com",
			position: {
				align: "right",
				x: -10,
				verticalAlign: "bottom",
				y: -5
			},
			style: {
				cursor: "pointer",
				color: "#909090",
				fontSize: "9px"
			}
		}
	};
	var X = N.plotOptions,
		W = X.line;
	Jb();
	var ma = function(a) {
		var b = [],
			c, d;
		(function(a) {
			a && a.stops ? d = La(a.stops, function(a) {
				return ma(a[1])
			}) : (c = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a)) ? b = [u(c[1]), u(c[2]), u(c[3]), parseFloat(c[4], 10)] : (c = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a)) ? b = [u(c[1], 16), u(c[2], 16), u(c[3],
				16), 1] : (c = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a)) && (b = [u(c[1]), u(c[2]), u(c[3]), 1])
		})(a);
		return {
			get: function(c) {
				var f;
				d ? (f = x(a), f.stops = [].concat(f.stops), n(d, function(a, b) {
					f.stops[b] = [f.stops[b][0], a.get(c)]
				})) : f = b && !isNaN(b[0]) ? c === "rgb" ? "rgb(" + b[0] + "," + b[1] + "," + b[2] + ")" : c === "a" ? b[3] : "rgba(" + b.join(",") + ")" : a;
				return f
			},
			brighten: function(a) {
				if (d) n(d, function(b) {
					b.brighten(a)
				});
				else if (Ea(a) && a !== 0) {
					var c;
					for (c = 0; c < 3; c++) b[c] += u(a * 255), b[c] < 0 && (b[c] = 0), b[c] > 255 &&
						(b[c] = 255)
				}
				return this
			},
			rgba: b,
			setOpacity: function(a) {
				b[3] = a;
				return this
			}
		}
	};
	ra.prototype = {
		init: function(a, b) {
			this.element = b === "span" ? U(b) : z.createElementNS(sa, b);
			this.renderer = a;
			this.attrSetters = {}
		},
		opacity: 1,
		animate: function(a, b, c) {
			b = o(b, za, !0);
			Ta(this);
			if (b) {
				b = x(b);
				if (c) b.complete = c;
				wb(this, a, b)
			} else this.attr(a), c && c()
		},
		attr: function(a, b) {
			var c, d, e, f, g = this.element,
				h = g.nodeName.toLowerCase(),
				i = this.renderer,
				j, k = this.attrSetters,
				m = this.shadows,
				l, p, s = this;
			fa(a) && r(b) && (c = a, a = {}, a[c] = b);
			if (fa(a)) c =
				a, h === "circle" ? c = {
					x: "cx",
					y: "cy"
				}[c] || c : c === "strokeWidth" && (c = "stroke-width"), s = A(g, c) || this[c] || 0, c !== "d" && c !== "visibility" && (s = parseFloat(s));
			else {
				for (c in a)
					if (j = !1, d = a[c], e = k[c] && k[c].call(this, d, c), e !== !1) {
						e !== y && (d = e);
						if (c === "d") d && d.join && (d = d.join(" ")), /(NaN| {2}|^$)/.test(d) && (d = "M 0 0");
						else if (c === "x" && h === "text")
							for (e = 0; e < g.childNodes.length; e++) f = g.childNodes[e], A(f, "x") === A(g, "x") && A(f, "x", d);
						else if (this.rotation && (c === "x" || c === "y")) p = !0;
						else if (c === "fill") d = i.color(d, g, c);
						else if (h ===
							"circle" && (c === "x" || c === "y")) c = {
							x: "cx",
							y: "cy"
						}[c] || c;
						else if (h === "rect" && c === "r") A(g, {
							rx: d,
							ry: d
						}), j = !0;
						else if (c === "translateX" || c === "translateY" || c === "rotation" || c === "verticalAlign" || c === "scaleX" || c === "scaleY") j = p = !0;
						else if (c === "stroke") d = i.color(d, g, c);
						else if (c === "dashstyle")
							if (c = "stroke-dasharray", d = d && d.toLowerCase(), d === "solid") d = S;
							else {
								if (d) {
									d = d.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash",
										"8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
									for (e = d.length; e--;) d[e] = u(d[e]) * a["stroke-width"];
									d = d.join(",")
								}
							} else if (c === "width") d = u(d);
						else if (c === "align") c = "text-anchor", d = {
							left: "start",
							center: "middle",
							right: "end"
						}[d];
						else if (c === "title") e = g.getElementsByTagName("title")[0], e || (e = z.createElementNS(sa, "title"), g.appendChild(e)), e.textContent = d;
						c === "strokeWidth" && (c = "stroke-width");
						if (c === "stroke-width" || c === "stroke") {
							this[c] = d;
							if (this.stroke && this["stroke-width"]) A(g,
								"stroke", this.stroke), A(g, "stroke-width", this["stroke-width"]), this.hasStroke = !0;
							else if (c === "stroke-width" && d === 0 && this.hasStroke) g.removeAttribute("stroke"), this.hasStroke = !1;
							j = !0
						}
						this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c) && (l || (this.symbolAttr(a), l = !0), j = !0);
						if (m && /^(width|height|visibility|x|y|d|transform)$/.test(c))
							for (e = m.length; e--;) A(m[e], c, c === "height" ? q(d - (m[e].cutHeight || 0), 0) : d);
						if ((c === "width" || c === "height") && h === "rect" && d < 0) d = 0;
						this[c] = d;
						c === "text" ?
							(d !== this.textStr && delete this.bBox, this.textStr = d, this.added && i.buildText(this)) : j || A(g, c, d)
					}
				p && this.updateTransform()
			}
			return s
		},
		addClass: function(a) {
			A(this.element, "class", A(this.element, "class") + " " + a);
			return this
		},
		symbolAttr: function(a) {
			var b = this;
			n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","), function(c) {
				b[c] = o(a[c], b[c])
			});
			b.attr({
				d: b.renderer.symbols[b.symbolName](b.x, b.y, b.width, b.height, b)
			})
		},
		clip: function(a) {
			return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" +
				a.id + ")" : S)
		},
		crisp: function(a, b, c, d, e) {
			var f, g = {},
				h = {},
				i, a = a || this.strokeWidth || this.attr && this.attr("stroke-width") || 0;
			i = t(a) % 2 / 2;
			h.x = T(b || this.x || 0) + i;
			h.y = T(c || this.y || 0) + i;
			h.width = T((d || this.width || 0) - 2 * i);
			h.height = T((e || this.height || 0) - 2 * i);
			h.strokeWidth = a;
			for (f in h) this[f] !== h[f] && (this[f] = g[f] = h[f]);
			return g
		},
		css: function(a) {
			var b = this.element,
				c = a && a.width && b.nodeName.toLowerCase() === "text",
				d, e = "",
				f = function(a, b) {
					return "-" + b.toLowerCase()
				};
			if (a && a.color) a.fill = a.color;
			this.styles = a = v(this.styles,
				a);
			$ && c && delete a.width;
			if (Fa && !Z) c && delete a.width, L(this.element, a);
			else {
				for (d in a) e += d.replace(/([A-Z])/g, f) + ":" + a[d] + ";";
				A(b, "style", e)
			}
			c && this.added && this.renderer.buildText(this);
			return this
		},
		on: function(a, b) {
			if (fb && a === "click") this.element.ontouchstart = function(a) {
				a.preventDefault();
				b()
			};
			this.element["on" + a] = b;
			return this
		},
		setRadialReference: function(a) {
			this.element.radialReference = a;
			return this
		},
		translate: function(a, b) {
			return this.attr({
				translateX: a,
				translateY: b
			})
		},
		invert: function() {
			this.inverted = !0;
			this.updateTransform();
			return this
		},
		htmlCss: function(a) {
			var b = this.element;
			if (b = a && b.tagName === "SPAN" && a.width) delete a.width, this.textWidth = b, this.updateTransform();
			this.styles = v(this.styles, a);
			L(this.element, a);
			return this
		},
		htmlGetBBox: function() {
			var a = this.element,
				b = this.bBox;
			if (!b) {
				if (a.nodeName === "text") a.style.position = "absolute";
				b = this.bBox = {
					x: a.offsetLeft,
					y: a.offsetTop,
					width: a.offsetWidth,
					height: a.offsetHeight
				}
			}
			return b
		},
		htmlUpdateTransform: function() {
			if (this.added) {
				var a = this.renderer,
					b = this.element,
					c = this.translateX || 0,
					d = this.translateY || 0,
					e = this.x || 0,
					f = this.y || 0,
					g = this.textAlign || "left",
					h = {
						left: 0,
						center: 0.5,
						right: 1
					}[g],
					i = g && g !== "left",
					j = this.shadows;
				L(b, {
					marginLeft: c,
					marginTop: d
				});
				j && n(j, function(a) {
					L(a, {
						marginLeft: c + 1,
						marginTop: d + 1
					})
				});
				this.inverted && n(b.childNodes, function(c) {
					a.invertChild(c, b)
				});
				if (b.tagName === "SPAN") {
					var k, m, j = this.rotation,
						l, p = 0,
						s = 1,
						p = 0,
						xb;
					l = u(this.textWidth);
					var B = this.xCorr || 0,
						w = this.yCorr || 0,
						G = [j, g, b.innerHTML, this.textWidth].join(",");
					k = {};
					if (G !== this.cTT) {
						if (r(j)) a.isSVG ?
							(B = Fa ? "-ms-transform" : db ? "-webkit-transform" : eb ? "MozTransform" : Lb ? "-o-transform" : "", k[B] = k.transform = "rotate(" + j + "deg)") : (p = j * bb, s = Y(p), p = ca(p), k.filter = j ? ["progid:DXImageTransform.Microsoft.Matrix(M11=", s, ", M12=", -p, ", M21=", p, ", M22=", s, ", sizingMethod='auto expand')"].join("") : S), L(b, k);
						k = o(this.elemWidth, b.offsetWidth);
						m = o(this.elemHeight, b.offsetHeight);
						if (k > l && /[ \-]/.test(b.textContent || b.innerText)) L(b, {
							width: l + "px",
							display: "block",
							whiteSpace: "normal"
						}), k = l;
						l = a.fontMetrics(b.style.fontSize).b;
						B = s < 0 && -k;
						w = p < 0 && -m;
						xb = s * p < 0;
						B += p * l * (xb ? 1 - h : h);
						w -= s * l * (j ? xb ? h : 1 - h : 1);
						i && (B -= k * h * (s < 0 ? -1 : 1), j && (w -= m * h * (p < 0 ? -1 : 1)), L(b, {
							textAlign: g
						}));
						this.xCorr = B;
						this.yCorr = w
					}
					L(b, {
						left: e + B + "px",
						top: f + w + "px"
					});
					if (db) m = b.offsetHeight;
					this.cTT = G
				}
			} else this.alignOnAdd = !0
		},
		updateTransform: function() {
			var a = this.translateX || 0,
				b = this.translateY || 0,
				c = this.scaleX,
				d = this.scaleY,
				e = this.inverted,
				f = this.rotation;
			e && (a += this.attr("width"), b += this.attr("height"));
			a = ["translate(" + a + "," + b + ")"];
			e ? a.push("rotate(90) scale(-1,1)") :
				f && a.push("rotate(" + f + " " + (this.x || 0) + " " + (this.y || 0) + ")");
			(r(c) || r(d)) && a.push("scale(" + o(c, 1) + " " + o(d, 1) + ")");
			a.length && A(this.element, "transform", a.join(" "))
		},
		toFront: function() {
			var a = this.element;
			a.parentNode.appendChild(a);
			return this
		},
		align: function(a, b, c) {
			var d, e, f, g, h = {};
			e = this.renderer;
			f = e.alignedObjects;
			if (a) {
				if (this.alignOptions = a, this.alignByTranslate = b, !c || fa(c)) this.alignTo = d = c || "renderer", ga(f, this), f.push(this), c = null
			} else a = this.alignOptions, b = this.alignByTranslate, d = this.alignTo;
			c = o(c, e[d], e);
			d = a.align;
			e = a.verticalAlign;
			f = (c.x || 0) + (a.x || 0);
			g = (c.y || 0) + (a.y || 0);
			if (d === "right" || d === "center") f += (c.width - (a.width || 0)) / {
				right: 1,
				center: 2
			}[d];
			h[b ? "translateX" : "x"] = t(f);
			if (e === "bottom" || e === "middle") g += (c.height - (a.height || 0)) / ({
				bottom: 1,
				middle: 2
			}[e] || 1);
			h[b ? "translateY" : "y"] = t(g);
			this[this.placed ? "animate" : "attr"](h);
			this.placed = !0;
			this.alignAttr = h;
			return this
		},
		getBBox: function() {
			var a = this.bBox,
				b = this.renderer,
				c, d = this.rotation;
			c = this.element;
			var e = this.styles,
				f = d * bb;
			if (!a) {
				if (c.namespaceURI ===
					sa || b.forExport) {
					try {
						a = c.getBBox ? v({}, c.getBBox()) : {
							width: c.offsetWidth,
							height: c.offsetHeight
						}
					} catch (g) {}
					if (!a || a.width < 0) a = {
						width: 0,
						height: 0
					}
				} else a = this.htmlGetBBox(); if (b.isSVG) {
					b = a.width;
					c = a.height;
					if (Fa && e && e.fontSize === "11px" && c.toPrecision(3) === "22.7") a.height = c = 14;
					if (d) a.width = Q(c * ca(f)) + Q(b * Y(f)), a.height = Q(c * Y(f)) + Q(b * ca(f))
				}
				this.bBox = a
			}
			return a
		},
		show: function() {
			return this.attr({
				visibility: "visible"
			})
		},
		hide: function() {
			return this.attr({
				visibility: "hidden"
			})
		},
		fadeOut: function(a) {
			var b = this;
			b.animate({
				opacity: 0
			}, {
				duration: a || 150,
				complete: function() {
					b.hide()
				}
			})
		},
		add: function(a) {
			var b = this.renderer,
				c = a || b,
				d = c.element || b.box,
				e = d.childNodes,
				f = this.element,
				g = A(f, "zIndex"),
				h;
			if (a) this.parentGroup = a;
			this.parentInverted = a && a.inverted;
			this.textStr !== void 0 && b.buildText(this);
			if (g) c.handleZ = !0, g = u(g);
			if (c.handleZ)
				for (c = 0; c < e.length; c++)
					if (a = e[c], b = A(a, "zIndex"), a !== f && (u(b) > g || !r(g) && r(b))) {
						d.insertBefore(f, a);
						h = !0;
						break
					}
			h || d.appendChild(f);
			this.added = !0;
			D(this, "add");
			return this
		},
		safeRemoveChild: function(a) {
			var b =
				a.parentNode;
			b && b.removeChild(a)
		},
		destroy: function() {
			var a = this,
				b = a.element || {},
				c = a.shadows,
				d, e;
			b.onclick = b.onmouseout = b.onmouseover = b.onmousemove = b.point = null;
			Ta(a);
			if (a.clipPath) a.clipPath = a.clipPath.destroy();
			if (a.stops) {
				for (e = 0; e < a.stops.length; e++) a.stops[e] = a.stops[e].destroy();
				a.stops = null
			}
			a.safeRemoveChild(b);
			c && n(c, function(b) {
				a.safeRemoveChild(b)
			});
			a.alignTo && ga(a.renderer.alignedObjects, a);
			for (d in a) delete a[d];
			return null
		},
		shadow: function(a, b, c) {
			var d = [],
				e, f, g = this.element,
				h, i, j, k;
			if (a) {
				i =
					o(a.width, 3);
				j = (a.opacity || 0.15) / i;
				k = this.parentInverted ? "(-1,-1)" : "(" + o(a.offsetX, 1) + ", " + o(a.offsetY, 1) + ")";
				for (e = 1; e <= i; e++) {
					f = g.cloneNode(0);
					h = i * 2 + 1 - 2 * e;
					A(f, {
						isShadow: "true",
						stroke: a.color || "black",
						"stroke-opacity": j * e,
						"stroke-width": h,
						transform: "translate" + k,
						fill: S
					});
					if (c) A(f, "height", q(A(f, "height") - h, 0)), f.cutHeight = h;
					b ? b.element.appendChild(f) : g.parentNode.insertBefore(f, g);
					d.push(f)
				}
				this.shadows = d
			}
			return this
		}
	};
	var Ca = function() {
		this.init.apply(this, arguments)
	};
	Ca.prototype = {
		Element: ra,
		init: function(a,
			b, c, d) {
			var e = location,
				f;
			f = this.createElement("svg").attr({
				xmlns: sa,
				version: "1.1"
			});
			a.appendChild(f.element);
			this.isSVG = !0;
			this.box = f.element;
			this.boxWrapper = f;
			this.alignedObjects = [];
			this.url = (eb || db) && z.getElementsByTagName("base").length ? e.href.replace(/#.*?$/, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : "";
			this.createElement("desc").add().element.appendChild(z.createTextNode("Created with Highcharts 3.0.2"));
			this.defs = this.createElement("defs").add();
			this.forExport = d;
			this.gradients = {};
			this.setSize(b,
				c, !1);
			var g;
			if (eb && a.getBoundingClientRect) this.subPixelFix = b = function() {
				L(a, {
					left: 0,
					top: 0
				});
				g = a.getBoundingClientRect();
				L(a, {
					left: ja(g.left) - g.left + "px",
					top: ja(g.top) - g.top + "px"
				})
			}, b(), J(O, "resize", b)
		},
		isHidden: function() {
			return !this.boxWrapper.getBBox().width
		},
		destroy: function() {
			var a = this.defs;
			this.box = null;
			this.boxWrapper = this.boxWrapper.destroy();
			Ha(this.gradients || {});
			this.gradients = null;
			if (a) this.defs = a.destroy();
			this.subPixelFix && ba(O, "resize", this.subPixelFix);
			return this.alignedObjects =
				null
		},
		createElement: function(a) {
			var b = new this.Element;
			b.init(this, a);
			return b
		},
		draw: function() {},
		buildText: function(a) {
			for (var b = a.element, c = this, d = c.forExport, e = o(a.textStr, "").toString().replace(/<(b|strong)>/g, '<span style="font-weight:bold">').replace(/<(i|em)>/g, '<span style="font-style:italic">').replace(/<a/g, "<span").replace(/<\/(b|strong|i|em|a)>/g, "</span>").split(/<br.*?>/g), f = b.childNodes, g = /style="([^"]+)"/, h = /href="([^"]+)"/, i = A(b, "x"), j = a.styles, k = j && j.width && u(j.width), m = j && j.lineHeight,
				l = f.length; l--;) b.removeChild(f[l]);
			k && !a.added && this.box.appendChild(b);
			e[e.length - 1] === "" && e.pop();
			n(e, function(e, f) {
				var l, o = 0,
					e = e.replace(/<span/g, "|||<span").replace(/<\/span>/g, "</span>|||");
				l = e.split("|||");
				n(l, function(e) {
					if (e !== "" || l.length === 1) {
						var p = {},
							n = z.createElementNS(sa, "tspan"),
							q;
						g.test(e) && (q = e.match(g)[1].replace(/(;| |^)color([ :])/, "$1fill$2"), A(n, "style", q));
						h.test(e) && !d && (A(n, "onclick", 'location.href="' + e.match(h)[1] + '"'), L(n, {
							cursor: "pointer"
						}));
						e = (e.replace(/<(.|\n)*?>/g,
							"") || " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">");
						n.appendChild(z.createTextNode(e));
						o ? p.dx = 0 : p.x = i;
						A(n, p);
						!o && f && (!Z && d && L(n, {
							display: "block"
						}), A(n, "dy", m || c.fontMetrics(/px$/.test(n.style.fontSize) ? n.style.fontSize : j.fontSize).h, db && n.offsetHeight));
						b.appendChild(n);
						o++;
						if (k)
							for (var e = e.replace(/([^\^])-/g, "$1- ").split(" "), r, t = []; e.length || t.length;) delete a.bBox, r = a.getBBox().width, p = r > k, !p || e.length === 1 ? (e = t, t = [], e.length && (n = z.createElementNS(sa, "tspan"), A(n, {
								dy: m || 16,
								x: i
							}), q && A(n, "style",
								q), b.appendChild(n), r > k && (k = r))) : (n.removeChild(n.firstChild), t.unshift(e.pop())), e.length && n.appendChild(z.createTextNode(e.join(" ").replace(/- /g, "-")))
					}
				})
			})
		},
		button: function(a, b, c, d, e, f, g) {
			var h = this.label(a, b, c, null, null, null, null, null, "button"),
				i = 0,
				j, k, m, l, p, a = {
					x1: 0,
					y1: 0,
					x2: 0,
					y2: 1
				},
				e = x({
					"stroke-width": 1,
					stroke: "#CCCCCC",
					fill: {
						linearGradient: a,
						stops: [
							[0, "#FEFEFE"],
							[1, "#F6F6F6"]
						]
					},
					r: 2,
					padding: 5,
					style: {
						color: "black"
					}
				}, e);
			m = e.style;
			delete e.style;
			f = x(e, {
				stroke: "#68A",
				fill: {
					linearGradient: a,
					stops: [
						[0,
							"#FFF"
						],
						[1, "#ACF"]
					]
				}
			}, f);
			l = f.style;
			delete f.style;
			g = x(e, {
				stroke: "#68A",
				fill: {
					linearGradient: a,
					stops: [
						[0, "#9BD"],
						[1, "#CDF"]
					]
				}
			}, g);
			p = g.style;
			delete g.style;
			J(h.element, "mouseenter", function() {
				h.attr(f).css(l)
			});
			J(h.element, "mouseleave", function() {
				j = [e, f, g][i];
				k = [m, l, p][i];
				h.attr(j).css(k)
			});
			h.setState = function(a) {
				(i = a) ? a === 2 && h.attr(g).css(p): h.attr(e).css(m)
			};
			return h.on("click", function() {
				d.call(h)
			}).attr(e).css(v({
				cursor: "default"
			}, m))
		},
		crispLine: function(a, b) {
			a[1] === a[4] && (a[1] = a[4] = t(a[1]) - b % 2 /
				2);
			a[2] === a[5] && (a[2] = a[5] = t(a[2]) + b % 2 / 2);
			return a
		},
		path: function(a) {
			var b = {
				fill: S
			};
			Da(a) ? b.d = a : V(a) && v(b, a);
			return this.createElement("path").attr(b)
		},
		circle: function(a, b, c) {
			a = V(a) ? a : {
				x: a,
				y: b,
				r: c
			};
			return this.createElement("circle").attr(a)
		},
		arc: function(a, b, c, d, e, f) {
			if (V(a)) b = a.y, c = a.r, d = a.innerR, e = a.start, f = a.end, a = a.x;
			return this.symbol("arc", a || 0, b || 0, c || 0, c || 0, {
				innerR: d || 0,
				start: e || 0,
				end: f || 0
			})
		},
		rect: function(a, b, c, d, e, f) {
			e = V(a) ? a.r : e;
			e = this.createElement("rect").attr({
				rx: e,
				ry: e,
				fill: S
			});
			return e.attr(V(a) ?
				a : e.crisp(f, a, b, q(c, 0), q(d, 0)))
		},
		setSize: function(a, b, c) {
			var d = this.alignedObjects,
				e = d.length;
			this.width = a;
			this.height = b;
			for (this.boxWrapper[o(c, !0) ? "animate" : "attr"]({
				width: a,
				height: b
			}); e--;) d[e].align()
		},
		g: function(a) {
			var b = this.createElement("g");
			return r(a) ? b.attr({
				"class": "highcharts-" + a
			}) : b
		},
		image: function(a, b, c, d, e) {
			var f = {
				preserveAspectRatio: S
			};
			arguments.length > 1 && v(f, {
				x: b,
				y: c,
				width: d,
				height: e
			});
			f = this.createElement("image").attr(f);
			f.element.setAttributeNS ? f.element.setAttributeNS("http://www.w3.org/1999/xlink",
				"href", a) : f.element.setAttribute("hc-svg-href", a);
			return f
		},
		symbol: function(a, b, c, d, e, f) {
			var g, h = this.symbols[a],
				h = h && h(t(b), t(c), d, e, f),
				i = /^url\((.*?)\)$/,
				j, k;
			if (h) g = this.path(h), v(g, {
				symbolName: a,
				x: b,
				y: c,
				width: d,
				height: e
			}), f && v(g, f);
			else if (i.test(a)) k = function(a, b) {
				a.element && (a.attr({
					width: b[0],
					height: b[1]
				}), a.alignByTranslate || a.translate(t((d - b[0]) / 2), t((e - b[1]) / 2)))
			}, j = a.match(i)[1], a = Nb[j], g = this.image(j).attr({
				x: b,
				y: c
			}), g.isImg = !0, a ? k(g, a) : (g.attr({
				width: 0,
				height: 0
			}), U("img", {
				onload: function() {
					k(g,
						Nb[j] = [this.width, this.height])
				},
				src: j
			}));
			return g
		},
		symbols: {
			circle: function(a, b, c, d) {
				var e = 0.166 * c;
				return ["M", a + c / 2, b, "C", a + c + e, b, a + c + e, b + d, a + c / 2, b + d, "C", a - e, b + d, a - e, b, a + c / 2, b, "Z"]
			},
			square: function(a, b, c, d) {
				return ["M", a, b, "L", a + c, b, a + c, b + d, a, b + d, "Z"]
			},
			triangle: function(a, b, c, d) {
				return ["M", a + c / 2, b, "L", a + c, b + d, a, b + d, "Z"]
			},
			"triangle-down": function(a, b, c, d) {
				return ["M", a, b, "L", a + c, b, a + c / 2, b + d, "Z"]
			},
			diamond: function(a, b, c, d) {
				return ["M", a + c / 2, b, "L", a + c, b + d / 2, a + c / 2, b + d, a, b + d / 2, "Z"]
			},
			arc: function(a, b, c, d,
				e) {
				var f = e.start,
					c = e.r || c || d,
					g = e.end - 0.001,
					d = e.innerR,
					h = e.open,
					i = Y(f),
					j = ca(f),
					k = Y(g),
					g = ca(g),
					e = e.end - f < Ka ? 0 : 1;
				return ["M", a + c * i, b + c * j, "A", c, c, 0, e, 1, a + c * k, b + c * g, h ? "M" : "L", a + d * k, b + d * g, "A", d, d, 0, e, 0, a + d * i, b + d * j, h ? "" : "Z"]
			}
		},
		clipRect: function(a, b, c, d) {
			var e = "highcharts-" + ub++,
				f = this.createElement("clipPath").attr({
					id: e
				}).add(this.defs),
				a = this.rect(a, b, c, d, 0).add(f);
			a.id = e;
			a.clipPath = f;
			return a
		},
		color: function(a, b, c) {
			var d = this,
				e, f = /^rgba/,
				g, h, i, j, k, m, l, p = [];
			a && a.linearGradient ? g = "linearGradient" : a && a.radialGradient &&
				(g = "radialGradient");
			if (g) {
				c = a[g];
				h = d.gradients;
				j = a.stops;
				b = b.radialReference;
				Da(c) && (a[g] = c = {
					x1: c[0],
					y1: c[1],
					x2: c[2],
					y2: c[3],
					gradientUnits: "userSpaceOnUse"
				});
				g === "radialGradient" && b && !r(c.gradientUnits) && (c = x(c, {
					cx: b[0] - b[2] / 2 + c.cx * b[2],
					cy: b[1] - b[2] / 2 + c.cy * b[2],
					r: c.r * b[2],
					gradientUnits: "userSpaceOnUse"
				}));
				for (l in c) l !== "id" && p.push(l, c[l]);
				for (l in j) p.push(j[l]);
				p = p.join(",");
				h[p] ? a = h[p].id : (c.id = a = "highcharts-" + ub++, h[p] = i = d.createElement(g).attr(c).add(d.defs), i.stops = [], n(j, function(a) {
					f.test(a[1]) ?
						(e = ma(a[1]), k = e.get("rgb"), m = e.get("a")) : (k = a[1], m = 1);
					a = d.createElement("stop").attr({
						offset: a[0],
						"stop-color": k,
						"stop-opacity": m
					}).add(i);
					i.stops.push(a)
				}));
				return "url(" + d.url + "#" + a + ")"
			} else return f.test(a) ? (e = ma(a), A(b, c + "-opacity", e.get("a")), e.get("rgb")) : (b.removeAttribute(c + "-opacity"), a)
		},
		text: function(a, b, c, d) {
			var e = N.chart.style,
				f = $ || !Z && this.forExport;
			if (d && !this.forExport) return this.html(a, b, c);
			b = t(o(b, 0));
			c = t(o(c, 0));
			a = this.createElement("text").attr({
				x: b,
				y: c,
				text: a
			}).css({
				fontFamily: e.fontFamily,
				fontSize: e.fontSize
			});
			f && a.css({
				position: "absolute"
			});
			a.x = b;
			a.y = c;
			return a
		},
		html: function(a, b, c) {
			var d = N.chart.style,
				e = this.createElement("span"),
				f = e.attrSetters,
				g = e.element,
				h = e.renderer;
			f.text = function(a) {
				a !== g.innerHTML && delete this.bBox;
				g.innerHTML = a;
				return !1
			};
			f.x = f.y = f.align = function(a, b) {
				b === "align" && (b = "textAlign");
				e[b] = a;
				e.htmlUpdateTransform();
				return !1
			};
			e.attr({
				text: a,
				x: t(b),
				y: t(c)
			}).css({
				position: "absolute",
				whiteSpace: "nowrap",
				fontFamily: d.fontFamily,
				fontSize: d.fontSize
			});
			e.css = e.htmlCss;
			if (h.isSVG) e.add = function(a) {
				var b, c = h.box.parentNode,
					d = [];
				if (a) {
					if (b = a.div, !b) {
						for (; a;) d.push(a), a = a.parentGroup;
						n(d.reverse(), function(a) {
							var d;
							b = a.div = a.div || U(ya, {
								className: A(a.element, "class")
							}, {
								position: "absolute",
								left: (a.translateX || 0) + "px",
								top: (a.translateY || 0) + "px"
							}, b || c);
							d = b.style;
							v(a.attrSetters, {
								translateX: function(a) {
									d.left = a + "px"
								},
								translateY: function(a) {
									d.top = a + "px"
								},
								visibility: function(a, b) {
									d[b] = a
								}
							})
						})
					}
				} else b = c;
				b.appendChild(g);
				e.added = !0;
				e.alignOnAdd && e.htmlUpdateTransform();
				return e
			};
			return e
		},
		fontMetrics: function(a) {
			var a = u(a || 11),
				a = a < 24 ? a + 4 : t(a * 1.2),
				b = t(a * 0.8);
			return {
				h: a,
				b: b
			}
		},
		label: function(a, b, c, d, e, f, g, h, i) {
			function j() {
				var a, b;
				a = o.element.style;
				w = (Ma === void 0 || yb === void 0 || s.styles.textAlign) && o.getBBox();
				s.width = (Ma || w.width || 0) + 2 * q + hb;
				s.height = (yb || w.height || 0) + 2 * q;
				A = q + p.fontMetrics(a && a.fontSize).b;
				if (z) {
					if (!B) a = t(-G * q), b = h ? -A : 0, s.box = B = d ? p.symbol(d, a, b, s.width, s.height) : p.rect(a, b, s.width, s.height, 0, u[Pb]), B.add(s);
					B.isImg || B.attr(x({
						width: s.width,
						height: s.height
					}, u));
					u = null
				}
			}

			function k() {
				var a = s.styles,
					a = a && a.textAlign,
					b = hb + q * (1 - G),
					c;
				c = h ? 0 : A;
				if (r(Ma) && (a === "center" || a === "right")) b += {
					center: 0.5,
					right: 1
				}[a] * (Ma - w.width);
				(b !== o.x || c !== o.y) && o.attr({
					x: b,
					y: c
				});
				o.x = b;
				o.y = c
			}

			function m(a, b) {
				B ? B.attr(a, b) : u[a] = b
			}

			function l() {
				o.add(s);
				s.attr({
					text: a,
					x: b,
					y: c
				});
				B && r(e) && s.attr({
					anchorX: e,
					anchorY: f
				})
			}
			var p = this,
				s = p.g(i),
				o = p.text("", 0, 0, g).attr({
					zIndex: 1
				}),
				B, w, G = 0,
				q = 3,
				hb = 0,
				Ma, yb, P, H, C = 0,
				u = {},
				A, g = s.attrSetters,
				z;
			J(s, "add", l);
			g.width = function(a) {
				Ma = a;
				return !1
			};
			g.height = function(a) {
				yb =
					a;
				return !1
			};
			g.padding = function(a) {
				r(a) && a !== q && (q = a, k());
				return !1
			};
			g.paddingLeft = function(a) {
				r(a) && a !== hb && (hb = a, k());
				return !1
			};
			g.align = function(a) {
				G = {
					left: 0,
					center: 0.5,
					right: 1
				}[a];
				return !1
			};
			g.text = function(a, b) {
				o.attr(b, a);
				j();
				k();
				return !1
			};
			g[Pb] = function(a, b) {
				z = !0;
				C = a % 2 / 2;
				m(b, a);
				return !1
			};
			g.stroke = g.fill = g.r = function(a, b) {
				b === "fill" && (z = !0);
				m(b, a);
				return !1
			};
			g.anchorX = function(a, b) {
				e = a;
				m(b, a + C - P);
				return !1
			};
			g.anchorY = function(a, b) {
				f = a;
				m(b, a - H);
				return !1
			};
			g.x = function(a) {
				s.x = a;
				a -= G * ((Ma || w.width) + q);
				P = t(a);
				s.attr("translateX", P);
				return !1
			};
			g.y = function(a) {
				H = s.y = t(a);
				s.attr("translateY", H);
				return !1
			};
			var E = s.css;
			return v(s, {
				css: function(a) {
					if (a) {
						var b = {},
							a = x(a);
						n("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration".split(","), function(c) {
							a[c] !== y && (b[c] = a[c], delete a[c])
						});
						o.css(b)
					}
					return E.call(s, a)
				},
				getBBox: function() {
					return {
						width: w.width + 2 * q,
						height: w.height + 2 * q,
						x: w.x - q,
						y: w.y - q
					}
				},
				shadow: function(a) {
					B && B.shadow(a);
					return s
				},
				destroy: function() {
					ba(s, "add", l);
					ba(s.element, "mouseenter");
					ba(s.element, "mouseleave");
					o && (o = o.destroy());
					B && (B = B.destroy());
					ra.prototype.destroy.call(s);
					s = p = j = k = m = l = null
				}
			})
		}
	};
	Sa = Ca;
	var F;
	if (!Z && !$) {
		Highcharts.VMLElement = F = {
			init: function(a, b) {
				var c = ["<", b, ' filled="f" stroked="f"'],
					d = ["position: ", "absolute", ";"],
					e = b === ya;
				(b === "shape" || e) && d.push("left:0;top:0;width:1px;height:1px;");
				d.push("visibility: ", e ? "hidden" : "visible");
				c.push(' style="', d.join(""), '"/>');
				if (b) c = e || b === "span" || b === "img" ? c.join("") : a.prepVML(c), this.element = U(c);
				this.renderer = a;
				this.attrSetters = {}
			},
			add: function(a) {
				var b = this.renderer,
					c = this.element,
					d = b.box,
					d = a ? a.element || a : d;
				a && a.inverted && b.invertChild(c, d);
				d.appendChild(c);
				this.added = !0;
				this.alignOnAdd && !this.deferUpdateTransform && this.updateTransform();
				D(this, "add");
				return this
			},
			updateTransform: ra.prototype.htmlUpdateTransform,
			attr: function(a, b) {
				var c, d, e, f = this.element || {},
					g = f.style,
					h = f.nodeName,
					i = this.renderer,
					j = this.symbolName,
					k, m = this.shadows,
					l, p = this.attrSetters,
					s = this;
				fa(a) && r(b) && (c = a, a = {}, a[c] = b);
				if (fa(a)) c = a, s = c === "strokeWidth" ||
					c === "stroke-width" ? this.strokeweight : this[c];
				else
					for (c in a)
						if (d = a[c], l = !1, e = p[c] && p[c].call(this, d, c), e !== !1 && d !== null) {
							e !== y && (d = e);
							if (j && /^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c)) k || (this.symbolAttr(a), k = !0), l = !0;
							else if (c === "d") {
								d = d || [];
								this.d = d.join(" ");
								e = d.length;
								l = [];
								for (var o; e--;)
									if (Ea(d[e])) l[e] = t(d[e] * 10) - 5;
									else if (d[e] === "Z") l[e] = "x";
								else if (l[e] = d[e], d.isArc && (d[e] === "wa" || d[e] === "at")) o = d[e] === "wa" ? 1 : -1, l[e + 5] === l[e + 7] && (l[e + 7] -= o), l[e + 6] === l[e + 8] && (l[e + 8] -=
									o);
								d = l.join(" ") || "x";
								f.path = d;
								if (m)
									for (e = m.length; e--;) m[e].path = m[e].cutOff ? this.cutOffPath(d, m[e].cutOff) : d;
								l = !0
							} else if (c === "visibility") {
								if (m)
									for (e = m.length; e--;) m[e].style[c] = d;
								h === "DIV" && (d = d === "hidden" ? "-999em" : 0, cb || (g[c] = d ? "visible" : "hidden"), c = "top");
								g[c] = d;
								l = !0
							} else if (c === "zIndex") d && (g[c] = d), l = !0;
							else if (la(c, ["x", "y", "width", "height"]) !== -1) this[c] = d, c === "x" || c === "y" ? c = {
								x: "left",
								y: "top"
							}[c] : d = q(0, d), this.updateClipping ? (this[c] = d, this.updateClipping()) : g[c] = d, l = !0;
							else if (c === "class" &&
								h === "DIV") f.className = d;
							else if (c === "stroke") d = i.color(d, f, c), c = "strokecolor";
							else if (c === "stroke-width" || c === "strokeWidth") f.stroked = d ? !0 : !1, c = "strokeweight", this[c] = d, Ea(d) && (d += "px");
							else if (c === "dashstyle")(f.getElementsByTagName("stroke")[0] || U(i.prepVML(["<stroke/>"]), null, null, f))[c] = d || "solid", this.dashstyle = d, l = !0;
							else if (c === "fill")
								if (h === "SPAN") g.color = d;
								else {
									if (h !== "IMG") f.filled = d !== S ? !0 : !1, d = i.color(d, f, c, this), c = "fillcolor"
								} else if (c === "opacity") l = !0;
							else if (h === "shape" && c === "rotation") this[c] =
								d, f.style.left = -t(ca(d * bb) + 1) + "px", f.style.top = t(Y(d * bb)) + "px";
							else if (c === "translateX" || c === "translateY" || c === "rotation") this[c] = d, this.updateTransform(), l = !0;
							else if (c === "text") this.bBox = null, f.innerHTML = d, l = !0;
							l || (cb ? f[c] = d : A(f, c, d))
						} return s
			},
			clip: function(a) {
				var b = this,
					c;
				a ? (c = a.members, ga(c, b), c.push(b), b.destroyClip = function() {
					ga(c, b)
				}, a = a.getCSS(b)) : (b.destroyClip && b.destroyClip(), a = {
					clip: cb ? "inherit" : "rect(auto)"
				});
				return b.css(a)
			},
			css: ra.prototype.htmlCss,
			safeRemoveChild: function(a) {
				a.parentNode &&
					Ra(a)
			},
			destroy: function() {
				this.destroyClip && this.destroyClip();
				return ra.prototype.destroy.apply(this)
			},
			on: function(a, b) {
				this.element["on" + a] = function() {
					var a = O.event;
					a.target = a.srcElement;
					b(a)
				};
				return this
			},
			cutOffPath: function(a, b) {
				var c, a = a.split(/[ ,]/);
				c = a.length;
				if (c === 9 || c === 11) a[c - 4] = a[c - 2] = u(a[c - 2]) - 10 * b;
				return a.join(" ")
			},
			shadow: function(a, b, c) {
				var d = [],
					e, f = this.element,
					g = this.renderer,
					h, i = f.style,
					j, k = f.path,
					m, l, p, s;
				k && typeof k.value !== "string" && (k = "x");
				l = k;
				if (a) {
					p = o(a.width, 3);
					s = (a.opacity ||
						0.15) / p;
					for (e = 1; e <= 3; e++) {
						m = p * 2 + 1 - 2 * e;
						c && (l = this.cutOffPath(k.value, m + 0.5));
						j = ['<shape isShadow="true" strokeweight="', m, '" filled="false" path="', l, '" coordsize="10 10" style="', f.style.cssText, '" />'];
						h = U(g.prepVML(j), null, {
							left: u(i.left) + o(a.offsetX, 1),
							top: u(i.top) + o(a.offsetY, 1)
						});
						if (c) h.cutOff = m + 1;
						j = ['<stroke color="', a.color || "black", '" opacity="', s * e, '"/>'];
						U(g.prepVML(j), null, null, h);
						b ? b.element.appendChild(h) : f.parentNode.insertBefore(h, f);
						d.push(h)
					}
					this.shadows = d
				}
				return this
			}
		};
		F = ea(ra, F);
		var na = {
			Element: F,
			isIE8: Aa.indexOf("MSIE 8.0") > -1,
			init: function(a, b, c) {
				var d, e;
				this.alignedObjects = [];
				d = this.createElement(ya);
				e = d.element;
				e.style.position = "relative";
				a.appendChild(d.element);
				this.isVML = !0;
				this.box = e;
				this.boxWrapper = d;
				this.setSize(b, c, !1);
				if (!z.namespaces.hcv) z.namespaces.add("hcv", "urn:schemas-microsoft-com:vml"), z.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
			},
			isHidden: function() {
				return !this.box.offsetWidth
			},
			clipRect: function(a, b, c, d) {
				var e = this.createElement(),
					f = V(a);
				return v(e, {
					members: [],
					left: f ? a.x : a,
					top: f ? a.y : b,
					width: f ? a.width : c,
					height: f ? a.height : d,
					getCSS: function(a) {
						var b = a.element,
							c = b.nodeName,
							a = a.inverted,
							d = this.top - (c === "shape" ? b.offsetTop : 0),
							e = this.left,
							b = e + this.width,
							f = d + this.height,
							d = {
								clip: "rect(" + t(a ? e : d) + "px," + t(a ? f : b) + "px," + t(a ? b : f) + "px," + t(a ? d : e) + "px)"
							};
						!a && cb && c === "DIV" && v(d, {
							width: b + "px",
							height: f + "px"
						});
						return d
					},
					updateClipping: function() {
						n(e.members, function(a) {
							a.css(e.getCSS(a))
						})
					}
				})
			},
			color: function(a, b, c, d) {
				var e = this,
					f, g = /^rgba/,
					h, i, j = S;
				a && a.linearGradient ? i = "gradient" : a && a.radialGradient && (i = "pattern");
				if (i) {
					var k, m, l = a.linearGradient || a.radialGradient,
						p, s, o, B, w, q = "",
						a = a.stops,
						r, t = [],
						y = function() {
							h = ['<fill colors="' + t.join(",") + '" opacity="', o, '" o:opacity2="', s, '" type="', i, '" ', q, 'focus="100%" method="any" />'];
							U(e.prepVML(h), null, null, b)
						};
					p = a[0];
					r = a[a.length - 1];
					p[0] > 0 && a.unshift([0, p[1]]);
					r[0] < 1 && a.push([1, r[1]]);
					n(a, function(a, b) {
						g.test(a[1]) ? (f = ma(a[1]), k = f.get("rgb"),
							m = f.get("a")) : (k = a[1], m = 1);
						t.push(a[0] * 100 + "% " + k);
						b ? (o = m, B = k) : (s = m, w = k)
					});
					if (c === "fill")
						if (i === "gradient") c = l.x1 || l[0] || 0, a = l.y1 || l[1] || 0, p = l.x2 || l[2] || 0, l = l.y2 || l[3] || 0, q = 'angle="' + (90 - I.atan((l - a) / (p - c)) * 180 / Ka) + '"', y();
						else {
							var j = l.r,
								v = j * 2,
								P = j * 2,
								H = l.cx,
								C = l.cy,
								x = b.radialReference,
								u, j = function() {
									x && (u = d.getBBox(), H += (x[0] - u.x) / u.width - 0.5, C += (x[1] - u.y) / u.height - 0.5, v *= x[2] / u.width, P *= x[2] / u.height);
									q = 'src="' + N.global.VMLRadialGradientURL + '" size="' + v + "," + P + '" origin="0.5,0.5" position="' + H + "," +
										C + '" color2="' + w + '" ';
									y()
								};
							d.added ? j() : J(d, "add", j);
							j = B
						} else j = k
				} else if (g.test(a) && b.tagName !== "IMG") f = ma(a), h = ["<", c, ' opacity="', f.get("a"), '"/>'], U(this.prepVML(h), null, null, b), j = f.get("rgb");
				else {
					j = b.getElementsByTagName(c);
					if (j.length) j[0].opacity = 1, j[0].type = "solid";
					j = a
				}
				return j
			},
			prepVML: function(a) {
				var b = this.isIE8,
					a = a.join("");
				b ? (a = a.replace("/>", ' xmlns="urn:schemas-microsoft-com:vml" />'), a = a.indexOf('style="') === -1 ? a.replace("/>", ' style="display:inline-block;behavior:url(#default#VML);" />') :
					a.replace('style="', 'style="display:inline-block;behavior:url(#default#VML);')) : a = a.replace("<", "<hcv:");
				return a
			},
			text: Ca.prototype.html,
			path: function(a) {
				var b = {
					coordsize: "10 10"
				};
				Da(a) ? b.d = a : V(a) && v(b, a);
				return this.createElement("shape").attr(b)
			},
			circle: function(a, b, c) {
				var d = this.symbol("circle");
				if (V(a)) c = a.r, b = a.y, a = a.x;
				d.isCircle = !0;
				return d.attr({
					x: a,
					y: b,
					width: 2 * c,
					height: 2 * c
				})
			},
			g: function(a) {
				var b;
				a && (b = {
					className: "highcharts-" + a,
					"class": "highcharts-" + a
				});
				return this.createElement(ya).attr(b)
			},
			image: function(a, b, c, d, e) {
				var f = this.createElement("img").attr({
					src: a
				});
				arguments.length > 1 && f.attr({
					x: b,
					y: c,
					width: d,
					height: e
				});
				return f
			},
			rect: function(a, b, c, d, e, f) {
				if (V(a)) b = a.y, c = a.width, d = a.height, f = a.strokeWidth, a = a.x;
				var g = this.symbol("rect");
				g.r = e;
				return g.attr(g.crisp(f, a, b, q(c, 0), q(d, 0)))
			},
			invertChild: function(a, b) {
				var c = b.style;
				L(a, {
					flip: "x",
					left: u(c.width) - 1,
					top: u(c.height) - 1,
					rotation: -90
				})
			},
			symbols: {
				arc: function(a, b, c, d, e) {
					var f = e.start,
						g = e.end,
						h = e.r || c || d,
						c = e.innerR,
						d = Y(f),
						i = ca(f),
						j = Y(g),
						k = ca(g);
					if (g - f === 0) return ["x"];
					f = ["wa", a - h, b - h, a + h, b + h, a + h * d, b + h * i, a + h * j, b + h * k];
					e.open && !c && f.push("e", "M", a, b);
					f.push("at", a - c, b - c, a + c, b + c, a + c * j, b + c * k, a + c * d, b + c * i, "x", "e");
					f.isArc = !0;
					return f
				},
				circle: function(a, b, c, d, e) {
					e && e.isCircle && (a -= c / 2, b -= d / 2);
					return ["wa", a, b, a + c, b + d, a + c, b + d / 2, a + c, b + d / 2, "e"]
				},
				rect: function(a, b, c, d, e) {
					var f = a + c,
						g = b + d,
						h;
					!r(e) || !e.r ? f = Ca.prototype.symbols.square.apply(0, arguments) : (h = K(e.r, c, d), f = ["M", a + h, b, "L", f - h, b, "wa", f - 2 * h, b, f, b + 2 * h, f - h, b, f, b + h, "L", f, g - h, "wa", f - 2 * h, g - 2 *
						h, f, g, f, g - h, f - h, g, "L", a + h, g, "wa", a, g - 2 * h, a + 2 * h, g, a + h, g, a, g - h, "L", a, b + h, "wa", a, b, a + 2 * h, b + 2 * h, a, b + h, a + h, b, "x", "e"
					]);
					return f
				}
			}
		};
		Highcharts.VMLRenderer = F = function() {
			this.init.apply(this, arguments)
		};
		F.prototype = x(Ca.prototype, na);
		Sa = F
	}
	var Rb;
	if ($) Highcharts.CanVGRenderer = F = function() {
		sa = "http://www.w3.org/1999/xhtml"
	}, F.prototype.symbols = {}, Rb = function() {
		function a() {
			var a = b.length,
				d;
			for (d = 0; d < a; d++) b[d]();
			b = []
		}
		var b = [];
		return {
			push: function(c, d) {
				b.length === 0 && Tb(d, a);
				b.push(c)
			}
		}
	}(), Sa = F;
	Ja.prototype = {
		addLabel: function() {
			var a = this.axis,
				b = a.options,
				c = a.chart,
				d = a.horiz,
				e = a.categories,
				f = a.series[0] && a.series[0].names,
				g = this.pos,
				h = b.labels,
				i = a.tickPositions,
				d = d && e && !h.step && !h.staggerLines && !h.rotation && c.plotWidth / i.length || !d && (c.optionsMarginLeft || c.plotWidth / 2),
				j = g === i[0],
				k = g === i[i.length - 1],
				f = e ? o(e[g], f && f[g], g) : g,
				e = this.label,
				i = i.info,
				m;
			a.isDatetimeAxis && i && (m = b.dateTimeLabelFormats[i.higherRanks[g] || i.unitName]);
			this.isFirst = j;
			this.isLast = k;
			b = a.labelFormatter.call({
				axis: a,
				chart: c,
				isFirst: j,
				isLast: k,
				dateTimeLabelFormat: m,
				value: a.isLog ? ia(da(f)) : f
			});
			g = d && {
				width: q(1, t(d - 2 * (h.padding || 10))) + "px"
			};
			g = v(g, h.style);
			if (r(e)) e && e.attr({
				text: b
			}).css(g);
			else {
				d = {
					align: h.align
				};
				if (Ea(h.rotation)) d.rotation = h.rotation;
				this.label = r(b) && h.enabled ? c.renderer.text(b, 0, 0, h.useHTML).attr(d).css(g).add(a.labelGroup) : null
			}
		},
		getLabelSize: function() {
			var a = this.label,
				b = this.axis;
			return a ? (this.labelBBox = a.getBBox())[b.horiz ? "height" : "width"] : 0
		},
		getLabelSides: function() {
			var a = this.axis.options.labels,
				b = this.labelBBox.width,
				a = b * {
					left: 0,
					center: 0.5,
					right: 1
				}[a.align] - a.x;
			return [-a, b - a]
		},
		handleOverflow: function(a, b) {
			var c = !0,
				d = this.axis,
				e = d.chart,
				f = this.isFirst,
				g = this.isLast,
				h = b.x,
				i = d.reversed,
				j = d.tickPositions;
			if (f || g) {
				var k = this.getLabelSides(),
					m = k[0],
					k = k[1],
					e = e.plotLeft,
					l = e + d.len,
					j = (d = d.ticks[j[a + (f ? 1 : -1)]]) && d.label.xy && d.label.xy.x + d.getLabelSides()[f ? 0 : 1];
				f && !i || g && i ? h + m < e && (h = e - m, d && h + k > j && (c = !1)) : h + k > l && (h = l - k, d && h + m < j && (c = !1));
				b.x = h
			}
			return c
		},
		getPosition: function(a, b, c, d) {
			var e = this.axis,
				f = e.chart,
				g = d && f.oldChartHeight ||
				f.chartHeight;
			return {
				x: a ? e.translate(b + c, null, null, d) + e.transB : e.left + e.offset + (e.opposite ? (d && f.oldChartWidth || f.chartWidth) - e.right - e.left : 0),
				y: a ? g - e.bottom + e.offset - (e.opposite ? e.height : 0) : g - e.translate(b + c, null, null, d) - e.transB
			}
		},
		getLabelPosition: function(a, b, c, d, e, f, g, h) {
			var i = this.axis,
				j = i.transA,
				k = i.reversed,
				i = i.staggerLines,
				a = a + e.x - (f && d ? f * j * (k ? -1 : 1) : 0),
				b = b + e.y - (f && !d ? f * j * (k ? 1 : -1) : 0);
			r(e.y) || (b += u(c.styles.lineHeight) * 0.9 - c.getBBox().height / 2);
			i && (b += g / (h || 1) % i * 16);
			return {
				x: a,
				y: b
			}
		},
		getMarkPath: function(a,
			b, c, d, e, f) {
			return f.crispLine(["M", a, b, "L", a + (e ? 0 : -c), b + (e ? c : 0)], d)
		},
		render: function(a, b, c) {
			var d = this.axis,
				e = d.options,
				f = d.chart.renderer,
				g = d.horiz,
				h = this.type,
				i = this.label,
				j = this.pos,
				k = e.labels,
				m = this.gridLine,
				l = h ? h + "Grid" : "grid",
				p = h ? h + "Tick" : "tick",
				s = e[l + "LineWidth"],
				n = e[l + "LineColor"],
				B = e[l + "LineDashStyle"],
				w = e[p + "Length"],
				l = e[p + "Width"] || 0,
				q = e[p + "Color"],
				r = e[p + "Position"],
				p = this.mark,
				t = k.step,
				v = !0,
				u = d.tickmarkOffset,
				P = this.getPosition(g, j, u, b),
				H = P.x,
				P = P.y,
				C = g && H === d.pos || !g && P === d.pos + d.len ?
				-1 : 1,
				x = d.staggerLines;
			this.isActive = !0;
			if (s) {
				j = d.getPlotLinePath(j + u, s * C, b, !0);
				if (m === y) {
					m = {
						stroke: n,
						"stroke-width": s
					};
					if (B) m.dashstyle = B;
					if (!h) m.zIndex = 1;
					if (b) m.opacity = 0;
					this.gridLine = m = s ? f.path(j).attr(m).add(d.gridGroup) : null
				}
				if (!b && m && j) m[this.isNew ? "attr" : "animate"]({
					d: j,
					opacity: c
				})
			}
			if (l && w) r === "inside" && (w = -w), d.opposite && (w = -w), b = this.getMarkPath(H, P, w, l * C, g, f), p ? p.animate({
				d: b,
				opacity: c
			}) : this.mark = f.path(b).attr({
				stroke: q,
				"stroke-width": l,
				opacity: c
			}).add(d.axisGroup);
			if (i && !isNaN(H)) i.xy =
				P = this.getLabelPosition(H, P, i, g, k, u, a, t), this.isFirst && !o(e.showFirstLabel, 1) || this.isLast && !o(e.showLastLabel, 1) ? v = !1 : !x && g && k.overflow === "justify" && !this.handleOverflow(a, P) && (v = !1), t && a % t && (v = !1), v && !isNaN(P.y) ? (P.opacity = c, i[this.isNew ? "attr" : "animate"](P), this.isNew = !1) : i.attr("y", -9999)
		},
		destroy: function() {
			Ha(this, this.axis)
		}
	};
	pb.prototype = {
		render: function() {
			var a = this,
				b = a.axis,
				c = b.horiz,
				d = (b.pointRange || 0) / 2,
				e = a.options,
				f = e.label,
				g = a.label,
				h = e.width,
				i = e.to,
				j = e.from,
				k = r(j) && r(i),
				m = e.value,
				l =
				e.dashStyle,
				p = a.svgElem,
				s = [],
				n, B = e.color,
				w = e.zIndex,
				G = e.events,
				t = b.chart.renderer;
			b.isLog && (j = ka(j), i = ka(i), m = ka(m));
			if (h) {
				if (s = b.getPlotLinePath(m, h), d = {
					stroke: B,
					"stroke-width": h
				}, l) d.dashstyle = l
			} else if (k) {
				if (j = q(j, b.min - d), i = K(i, b.max + d), s = b.getPlotBandPath(j, i, e), d = {
					fill: B
				}, e.borderWidth) d.stroke = e.borderColor, d["stroke-width"] = e.borderWidth
			} else return; if (r(w)) d.zIndex = w;
			if (p) s ? p.animate({
				d: s
			}, null, p.onGetPath) : (p.hide(), p.onGetPath = function() {
				p.show()
			});
			else if (s && s.length && (a.svgElem = p = t.path(s).attr(d).add(),
				G))
				for (n in e = function(b) {
					p.on(b, function(c) {
						G[b].apply(a, [c])
					})
				}, G) e(n);
			if (f && r(f.text) && s && s.length && b.width > 0 && b.height > 0) {
				f = x({
					align: c && k && "center",
					x: c ? !k && 4 : 10,
					verticalAlign: !c && k && "middle",
					y: c ? k ? 16 : 10 : k ? 6 : -4,
					rotation: c && !k && 90
				}, f);
				if (!g) a.label = g = t.text(f.text, 0, 0).attr({
					align: f.textAlign || f.align,
					rotation: f.rotation,
					zIndex: w
				}).css(f.style).add();
				b = [s[1], s[4], o(s[6], s[1])];
				s = [s[2], s[5], o(s[7], s[2])];
				c = Ga(b);
				k = Ga(s);
				g.align(f, !1, {
					x: c,
					y: k,
					width: pa(b) - c,
					height: pa(s) - k
				});
				g.show()
			} else g && g.hide();
			return a
		},
		destroy: function() {
			ga(this.axis.plotLinesAndBands, this);
			Ha(this, this.axis)
		}
	};
	Kb.prototype = {
		destroy: function() {
			Ha(this, this.axis)
		},
		setTotal: function(a) {
			this.cum = this.total = a
		},
		render: function(a) {
			var b = this.options,
				c = b.format,
				c = c ? wa(c, this) : b.formatter.call(this);
			this.label ? this.label.attr({
				text: c,
				visibility: "hidden"
			}) : this.label = this.axis.chart.renderer.text(c, 0, 0, b.useHTML).css(b.style).attr({
				align: this.textAlign,
				rotation: b.rotation,
				visibility: "hidden"
			}).add(a)
		},
		setOffset: function(a, b) {
			var c =
				this.axis,
				d = c.chart,
				e = d.inverted,
				f = this.isNegative,
				g = c.translate(this.percent ? 100 : this.total, 0, 0, 0, 1),
				c = c.translate(0),
				c = Q(g - c),
				h = d.xAxis[0].translate(this.x) + a,
				i = d.plotHeight,
				f = {
					x: e ? f ? g : g - c : h,
					y: e ? i - h - b : f ? i - g - c : i - g,
					width: e ? c : b,
					height: e ? b : c
				};
			if (e = this.label) e.align(this.alignOptions, null, f), f = e.alignAttr, e.attr({
				visibility: this.options.crop === !1 || d.isInsidePlot(f.x, f.y) ? Z ? "inherit" : "visible" : "hidden"
			})
		}
	};
	ab.prototype = {
		defaultOptions: {
			dateTimeLabelFormats: {
				millisecond: "%H:%M:%S.%L",
				second: "%H:%M:%S",
				minute: "%H:%M",
				hour: "%H:%M",
				day: "%e. %b",
				week: "%e. %b",
				month: "%b '%y",
				year: "%Y"
			},
			endOnTick: !1,
			gridLineColor: "#C0C0C0",
			labels: M,
			lineColor: "#C0D0E0",
			lineWidth: 1,
			minPadding: 0.01,
			maxPadding: 0.01,
			minorGridLineColor: "#E0E0E0",
			minorGridLineWidth: 1,
			minorTickColor: "#A0A0A0",
			minorTickLength: 2,
			minorTickPosition: "outside",
			startOfWeek: 1,
			startOnTick: !1,
			tickColor: "#C0D0E0",
			tickLength: 5,
			tickmarkPlacement: "between",
			tickPixelInterval: 100,
			tickPosition: "outside",
			tickWidth: 1,
			title: {
				align: "middle",
				style: {
					color: "#4d759e",
					fontWeight: "bold"
				}
			},
			type: "linear"
		},
		defaultYAxisOptions: {
			endOnTick: !0,
			gridLineWidth: 1,
			tickPixelInterval: 72,
			showLastLabel: !0,
			labels: {
				align: "right",
				x: -8,
				y: 3
			},
			lineWidth: 0,
			maxPadding: 0.05,
			minPadding: 0.05,
			startOnTick: !0,
			tickWidth: 0,
			title: {
				rotation: 270,
				text: "Values"
			},
			stackLabels: {
				enabled: !1,
				formatter: function() {
					return ua(this.total, -1)
				},
				style: M.style
			}
		},
		defaultLeftAxisOptions: {
			labels: {
				align: "right",
				x: -8,
				y: null
			},
			title: {
				rotation: 270
			}
		},
		defaultRightAxisOptions: {
			labels: {
				align: "left",
				x: 8,
				y: null
			},
			title: {
				rotation: 90
			}
		},
		defaultBottomAxisOptions: {
			labels: {
				align: "center",
				x: 0,
				y: 14
			},
			title: {
				rotation: 0
			}
		},
		defaultTopAxisOptions: {
			labels: {
				align: "center",
				x: 0,
				y: -5
			},
			title: {
				rotation: 0
			}
		},
		init: function(a, b) {
			var c = b.isX;
			this.horiz = a.inverted ? !c : c;
			this.xOrY = (this.isXAxis = c) ? "x" : "y";
			this.opposite = b.opposite;
			this.side = this.horiz ? this.opposite ? 0 : 2 : this.opposite ? 1 : 3;
			this.setOptions(b);
			var d = this.options,
				e = d.type;
			this.labelFormatter = d.labels.formatter || this.defaultLabelFormatter;
			this.staggerLines = this.horiz && d.labels.staggerLines;
			this.userOptions =
				b;
			this.minPixelPadding = 0;
			this.chart = a;
			this.reversed = d.reversed;
			this.zoomEnabled = d.zoomEnabled !== !1;
			this.categories = d.categories || e === "category";
			this.isLog = e === "logarithmic";
			this.isDatetimeAxis = e === "datetime";
			this.isLinked = r(d.linkedTo);
			this.tickmarkOffset = this.categories && d.tickmarkPlacement === "between" ? 0.5 : 0;
			this.ticks = {};
			this.minorTicks = {};
			this.plotLinesAndBands = [];
			this.alternateBands = {};
			this.len = 0;
			this.minRange = this.userMinRange = d.minRange || d.maxZoom;
			this.range = d.range;
			this.offset = d.offset || 0;
			this.stacks = {};
			this._stacksTouched = 0;
			this.min = this.max = null;
			var f, d = this.options.events;
			la(this, a.axes) === -1 && (a.axes.push(this), a[c ? "xAxis" : "yAxis"].push(this));
			this.series = this.series || [];
			if (a.inverted && c && this.reversed === y) this.reversed = !0;
			this.removePlotLine = this.removePlotBand = this.removePlotBandOrLine;
			for (f in d) J(this, f, d[f]);
			if (this.isLog) this.val2lin = ka, this.lin2val = da
		},
		setOptions: function(a) {
			this.options = x(this.defaultOptions, this.isXAxis ? {} : this.defaultYAxisOptions, [this.defaultTopAxisOptions,
				this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions
			][this.side], x(N[this.isXAxis ? "xAxis" : "yAxis"], a))
		},
		update: function(a, b) {
			var c = this.chart,
				a = c.options[this.xOrY + "Axis"][this.options.index] = x(this.userOptions, a);
			this.destroy();
			this._addedPlotLB = !1;
			this.init(c, a);
			c.isDirtyBox = !0;
			o(b, !0) && c.redraw()
		},
		remove: function(a) {
			var b = this.chart,
				c = this.xOrY + "Axis";
			n(this.series, function(a) {
				a.remove(!1)
			});
			ga(b.axes, this);
			ga(b[c], this);
			b.options[c].splice(this.options.index,
				1);
			n(b[c], function(a, b) {
				a.options.index = b
			});
			this.destroy();
			b.isDirtyBox = !0;
			o(a, !0) && b.redraw()
		},
		defaultLabelFormatter: function() {
			var a = this.axis,
				b = this.value,
				c = a.categories,
				d = this.dateTimeLabelFormat,
				e = N.lang.numericSymbols,
				f = e && e.length,
				g, h = a.options.labels.format,
				a = a.isLog ? b : a.tickInterval;
			if (h) g = wa(h, this);
			else if (c) g = b;
			else if (d) g = Ua(d, b);
			else if (f && a >= 1E3)
				for (; f-- && g === y;) c = Math.pow(1E3, f + 1), a >= c && e[f] !== null && (g = ua(b / c, -1) + e[f]);
			g === y && (g = b >= 1E3 ? ua(b, 0) : ua(b, -1));
			return g
		},
		getSeriesExtremes: function() {
			var a =
				this,
				b = a.chart,
				c = a.stacks,
				d = [],
				e = [],
				f = a._stacksTouched += 1,
				g, h;
			a.hasVisibleSeries = !1;
			a.dataMin = a.dataMax = null;
			n(a.series, function(g) {
				if (g.visible || !b.options.chart.ignoreHiddenSeries) {
					var j = g.options,
						k, m, l, p, s, n, B, w, G, t = j.threshold,
						v, u = [],
						x = 0;
					a.hasVisibleSeries = !0;
					if (a.isLog && t <= 0) t = j.threshold = null;
					if (a.isXAxis) {
						if (j = g.xData, j.length) a.dataMin = K(o(a.dataMin, j[0]), Ga(j)), a.dataMax = q(o(a.dataMax, j[0]), pa(j))
					} else {
						var P, H, C, A = g.cropped,
							z = g.xAxis.getExtremes(),
							E = !!g.modifyValue;
						k = j.stacking;
						a.usePercentage =
							k === "percent";
						if (k) s = j.stack, p = g.type + o(s, ""), n = "-" + p, g.stackKey = p, m = d[p] || [], d[p] = m, l = e[n] || [], e[n] = l;
						if (a.usePercentage) a.dataMin = 0, a.dataMax = 99;
						j = g.processedXData;
						B = g.processedYData;
						v = B.length;
						for (h = 0; h < v; h++) {
							w = j[h];
							G = B[h];
							if (k) H = (P = G < t) ? l : m, C = P ? n : p, r(H[w]) ? (H[w] = ia(H[w] + G), G = [G, H[w]]) : H[w] = G, c[C] || (c[C] = {}), c[C][w] || (c[C][w] = new Kb(a, a.options.stackLabels, P, w, s, k)), c[C][w].setTotal(H[w]), c[C][w].touched = f;
							if (G !== null && G !== y && (!a.isLog || G.length || G > 0))
								if (E && (G = g.modifyValue(G)), g.getExtremesFromAll ||
									A || (j[h + 1] || w) >= z.min && (j[h - 1] || w) <= z.max)
									if (w = G.length)
										for (; w--;) G[w] !== null && (u[x++] = G[w]);
									else u[x++] = G
						}
						if (!a.usePercentage && u.length) g.dataMin = k = Ga(u), g.dataMax = g = pa(u), a.dataMin = K(o(a.dataMin, k), k), a.dataMax = q(o(a.dataMax, g), g);
						if (r(t))
							if (a.dataMin >= t) a.dataMin = t, a.ignoreMinPadding = !0;
							else if (a.dataMax < t) a.dataMax = t, a.ignoreMaxPadding = !0
					}
				}
			});
			for (g in c)
				for (h in c[g]) c[g][h].touched < f && (c[g][h].destroy(), delete c[g][h])
		},
		translate: function(a, b, c, d, e, f) {
			var g = this.len,
				h = 1,
				i = 0,
				j = d ? this.oldTransA :
				this.transA,
				d = d ? this.oldMin : this.min,
				k = this.minPixelPadding,
				e = (this.options.ordinal || this.isLog && e) && this.lin2val;
			if (!j) j = this.transA;
			c && (h *= -1, i = g);
			this.reversed && (h *= -1, i -= h * g);
			b ? (a = a * h + i, a -= k, a = a / j + d, e && (a = this.lin2val(a))) : (e && (a = this.val2lin(a)), a = h * (a - d) * j + i + h * k + (f ? j * this.pointRange / 2 : 0));
			return a
		},
		toPixels: function(a, b) {
			return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos)
		},
		toValue: function(a, b) {
			return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0)
		},
		getPlotLinePath: function(a,
			b, c, d) {
			var e = this.chart,
				f = this.left,
				g = this.top,
				h, i, j, a = this.translate(a, null, null, c),
				k = c && e.oldChartHeight || e.chartHeight,
				m = c && e.oldChartWidth || e.chartWidth,
				l;
			h = this.transB;
			c = i = t(a + h);
			h = j = t(k - a - h);
			if (isNaN(a)) l = !0;
			else if (this.horiz) {
				if (h = g, j = k - this.bottom, c < f || c > f + this.width) l = !0
			} else if (c = f, i = m - this.right, h < g || h > g + this.height) l = !0;
			return l && !d ? null : e.renderer.crispLine(["M", c, h, "L", i, j], b || 0)
		},
		getPlotBandPath: function(a, b) {
			var c = this.getPlotLinePath(b),
				d = this.getPlotLinePath(a);
			d && c ? d.push(c[4],
				c[5], c[1], c[2]) : d = null;
			return d
		},
		getLinearTickPositions: function(a, b, c) {
			for (var d, b = ia(T(b / a) * a), c = ia(ja(c / a) * a), e = []; b <= c;) {
				e.push(b);
				b = ia(b + a);
				if (b === d) break;
				d = b
			}
			return e
		},
		getLogTickPositions: function(a, b, c, d) {
			var e = this.options,
				f = this.len,
				g = [];
			if (!d) this._minorAutoInterval = null;
			if (a >= 0.5) a = t(a), g = this.getLinearTickPositions(a, b, c);
			else if (a >= 0.08)
				for (var f = T(b), h, i, j, k, m, e = a > 0.3 ? [1, 2, 4] : a > 0.15 ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; f < c + 1 && !m; f++) {
					i = e.length;
					for (h = 0; h < i && !m; h++) j = ka(da(f) * e[h]), j > b && (!d ||
						k <= c) && g.push(k), k > c && (m = !0), k = j
				} else if (b = da(b), c = da(c), a = e[d ? "minorTickInterval" : "tickInterval"], a = o(a === "auto" ? null : a, this._minorAutoInterval, (c - b) * (e.tickPixelInterval / (d ? 5 : 1)) / ((d ? f / this.tickPositions.length : f) || 1)), a = ib(a, null, I.pow(10, T(I.log(a) / I.LN10))), g = La(this.getLinearTickPositions(a, b, c), ka), !d) this._minorAutoInterval = a / 5;
			if (!d) this.tickInterval = a;
			return g
		},
		getMinorTickPositions: function() {
			var a = this.options,
				b = this.tickPositions,
				c = this.minorTickInterval,
				d = [],
				e;
			if (this.isLog) {
				e = b.length;
				for (a = 1; a < e; a++) d = d.concat(this.getLogTickPositions(c, b[a - 1], b[a], !0))
			} else if (this.isDatetimeAxis && a.minorTickInterval === "auto") d = d.concat(Cb(Ab(c), this.min, this.max, a.startOfWeek)), d[0] < this.min && d.shift();
			else
				for (b = this.min + (b[0] - this.min) % c; b <= this.max; b += c) d.push(b);
			return d
		},
		adjustForMinRange: function() {
			var a = this.options,
				b = this.min,
				c = this.max,
				d, e = this.dataMax - this.dataMin >= this.minRange,
				f, g, h, i, j;
			if (this.isXAxis && this.minRange === y && !this.isLog) r(a.min) || r(a.max) ? this.minRange = null : (n(this.series,
				function(a) {
					i = a.xData;
					for (g = j = a.xIncrement ? 1 : i.length - 1; g > 0; g--)
						if (h = i[g] - i[g - 1], f === y || h < f) f = h
				}), this.minRange = K(f * 5, this.dataMax - this.dataMin));
			if (c - b < this.minRange) {
				var k = this.minRange;
				d = (k - c + b) / 2;
				d = [b - d, o(a.min, b - d)];
				if (e) d[2] = this.dataMin;
				b = pa(d);
				c = [b + k, o(a.max, b + k)];
				if (e) c[2] = this.dataMax;
				c = Ga(c);
				c - b < k && (d[0] = c - k, d[1] = o(a.min, c - k), b = pa(d))
			}
			this.min = b;
			this.max = c
		},
		setAxisTranslation: function(a) {
			var b = this.max - this.min,
				c = 0,
				d, e = 0,
				f = 0,
				g = this.linkedParent,
				h = this.transA;
			if (this.isXAxis) g ? (e = g.minPointOffset,
				f = g.pointRangePadding) : n(this.series, function(a) {
				var g = a.pointRange,
					h = a.options.pointPlacement,
					m = a.closestPointRange;
				g > b && (g = 0);
				c = q(c, g);
				e = q(e, h ? 0 : g / 2);
				f = q(f, h === "on" ? 0 : g);
				!a.noSharedTooltip && r(m) && (d = r(d) ? K(d, m) : m)
			}), g = this.ordinalSlope && d ? this.ordinalSlope / d : 1, this.minPointOffset = e *= g, this.pointRangePadding = f *= g, this.pointRange = K(c, b), this.closestPointRange = d;
			if (a) this.oldTransA = h;
			this.translationSlope = this.transA = h = this.len / (b + f || 1);
			this.transB = this.horiz ? this.left : this.bottom;
			this.minPixelPadding =
				h * e
		},
		setTickPositions: function(a) {
			var b = this,
				c = b.chart,
				d = b.options,
				e = b.isLog,
				f = b.isDatetimeAxis,
				g = b.isXAxis,
				h = b.isLinked,
				i = b.options.tickPositioner,
				j = d.maxPadding,
				k = d.minPadding,
				m = d.tickInterval,
				l = d.minTickInterval,
				p = d.tickPixelInterval,
				s = b.categories;
			h ? (b.linkedParent = c[g ? "xAxis" : "yAxis"][d.linkedTo], c = b.linkedParent.getExtremes(), b.min = o(c.min, c.dataMin), b.max = o(c.max, c.dataMax), d.type !== b.linkedParent.options.type && qa(11, 1)) : (b.min = o(b.userMin, d.min, b.dataMin), b.max = o(b.userMax, d.max, b.dataMax));
			if (e) !a && K(b.min, o(b.dataMin, b.min)) <= 0 && qa(10, 1), b.min = ia(ka(b.min)), b.max = ia(ka(b.max));
			if (b.range && (b.userMin = b.min = q(b.min, b.max - b.range), b.userMax = b.max, a)) b.range = null;
			b.beforePadding && b.beforePadding();
			b.adjustForMinRange();
			if (!s && !b.usePercentage && !h && r(b.min) && r(b.max) && (c = b.max - b.min)) {
				if (!r(d.min) && !r(b.userMin) && k && (b.dataMin < 0 || !b.ignoreMinPadding)) b.min -= c * k;
				if (!r(d.max) && !r(b.userMax) && j && (b.dataMax > 0 || !b.ignoreMaxPadding)) b.max += c * j
			}
			b.tickInterval = b.min === b.max || b.min === void 0 || b.max ===
				void 0 ? 1 : h && !m && p === b.linkedParent.options.tickPixelInterval ? b.linkedParent.tickInterval : o(m, s ? 1 : (b.max - b.min) * p / (b.len || 1));
			g && !a && n(b.series, function(a) {
				a.processData(b.min !== b.oldMin || b.max !== b.oldMax)
			});
			b.setAxisTranslation(!0);
			b.beforeSetTickPositions && b.beforeSetTickPositions();
			if (b.postProcessTickInterval) b.tickInterval = b.postProcessTickInterval(b.tickInterval);
			if (!m && b.tickInterval < l) b.tickInterval = l;
			if (!f && !e && (a = I.pow(10, T(I.log(b.tickInterval) / I.LN10)), !m)) b.tickInterval = ib(b.tickInterval,
				null, a, d);
			b.minorTickInterval = d.minorTickInterval === "auto" && b.tickInterval ? b.tickInterval / 5 : d.minorTickInterval;
			b.tickPositions = i = d.tickPositions ? [].concat(d.tickPositions) : i && i.apply(b, [b.min, b.max]);
			if (!i) i = f ? (b.getNonLinearTimeTicks || Cb)(Ab(b.tickInterval, d.units), b.min, b.max, d.startOfWeek, b.ordinalPositions, b.closestPointRange, !0) : e ? b.getLogTickPositions(b.tickInterval, b.min, b.max) : b.getLinearTickPositions(b.tickInterval, b.min, b.max), b.tickPositions = i;
			if (!h) e = i[0], f = i[i.length - 1], h = b.minPointOffset ||
				0, d.startOnTick ? b.min = e : b.min - h > e && i.shift(), d.endOnTick ? b.max = f : b.max + h < f && i.pop(), i.length === 1 && (b.min -= 0.001, b.max += 0.001)
		},
		setMaxTicks: function() {
			var a = this.chart,
				b = a.maxTicks || {},
				c = this.tickPositions,
				d = this._maxTicksKey = [this.xOrY, this.pos, this.len].join("-");
			if (!this.isLinked && !this.isDatetimeAxis && c && c.length > (b[d] || 0) && this.options.alignTicks !== !1) b[d] = c.length;
			a.maxTicks = b
		},
		adjustTickAmount: function() {
			var a = this._maxTicksKey,
				b = this.tickPositions,
				c = this.chart.maxTicks;
			if (c && c[a] && !this.isDatetimeAxis &&
				!this.categories && !this.isLinked && this.options.alignTicks !== !1) {
				var d = this.tickAmount,
					e = b.length;
				this.tickAmount = a = c[a];
				if (e < a) {
					for (; b.length < a;) b.push(ia(b[b.length - 1] + this.tickInterval));
					this.transA *= (e - 1) / (a - 1);
					this.max = b[b.length - 1]
				}
				if (r(d) && a !== d) this.isDirty = !0
			}
		},
		setScale: function() {
			var a = this.stacks,
				b, c, d, e;
			this.oldMin = this.min;
			this.oldMax = this.max;
			this.oldAxisLength = this.len;
			this.setAxisSize();
			e = this.len !== this.oldAxisLength;
			n(this.series, function(a) {
				if (a.isDirtyData || a.isDirty || a.xAxis.isDirty) d = !0
			});
			if (e || d || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax)
				if (this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickPositions(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, !this.isDirty) this.isDirty = e || this.min !== this.oldMin || this.max !== this.oldMax;
			if (!this.isXAxis)
				for (b in a)
					for (c in a[b]) a[b][c].cum = a[b][c].total;
			this.setMaxTicks()
		},
		setExtremes: function(a, b, c, d, e) {
			var f = this,
				g = f.chart,
				c = o(c, !0),
				e = v(e, {
					min: a,
					max: b
				});
			D(f, "setExtremes",
				e, function() {
					f.userMin = a;
					f.userMax = b;
					f.isDirtyExtremes = !0;
					c && g.redraw(d)
				})
		},
		zoom: function(a, b) {
			this.allowZoomOutside || (a <= this.dataMin && (a = y), b >= this.dataMax && (b = y));
			this.displayBtn = a !== y || b !== y;
			this.setExtremes(a, b, !1, y, {
				trigger: "zoom"
			});
			return !0
		},
		setAxisSize: function() {
			var a = this.chart,
				b = this.options,
				c = b.offsetLeft || 0,
				d = b.offsetRight || 0,
				e = this.horiz,
				f, g;
			this.left = g = o(b.left, a.plotLeft + c);
			this.top = f = o(b.top, a.plotTop);
			this.width = c = o(b.width, a.plotWidth - c + d);
			this.height = b = o(b.height, a.plotHeight);
			this.bottom = a.chartHeight - b - f;
			this.right = a.chartWidth - c - g;
			this.len = q(e ? c : b, 0);
			this.pos = e ? g : f
		},
		getExtremes: function() {
			var a = this.isLog;
			return {
				min: a ? ia(da(this.min)) : this.min,
				max: a ? ia(da(this.max)) : this.max,
				dataMin: this.dataMin,
				dataMax: this.dataMax,
				userMin: this.userMin,
				userMax: this.userMax
			}
		},
		getThreshold: function(a) {
			var b = this.isLog,
				c = b ? da(this.min) : this.min,
				b = b ? da(this.max) : this.max;
			c > a || a === null ? a = c : b < a && (a = b);
			return this.translate(a, 0, 1, 0, 1)
		},
		addPlotBand: function(a) {
			this.addPlotBandOrLine(a, "plotBands")
		},
		addPlotLine: function(a) {
			this.addPlotBandOrLine(a, "plotLines")
		},
		addPlotBandOrLine: function(a, b) {
			var c = (new pb(this, a)).render(),
				d = this.userOptions;
			b && (d[b] = d[b] || [], d[b].push(a));
			this.plotLinesAndBands.push(c);
			return c
		},
		getOffset: function() {
			var a = this,
				b = a.chart,
				c = b.renderer,
				d = a.options,
				e = a.tickPositions,
				f = a.ticks,
				g = a.horiz,
				h = a.side,
				i = b.inverted ? [1, 0, 3, 2][h] : h,
				j, k = 0,
				m, l = 0,
				p = d.title,
				s = d.labels,
				t = 0,
				B = b.axisOffset,
				w = b.clipOffset,
				G = [-1, 1, 1, -1][h],
				v;
			a.hasData = b = a.hasVisibleSeries || r(a.min) && r(a.max) && !!e;
			a.showAxis = j = b || o(d.showEmpty, !0);
			if (!a.axisGroup) a.gridGroup = c.g("grid").attr({
				zIndex: d.gridZIndex || 1
			}).add(), a.axisGroup = c.g("axis").attr({
				zIndex: d.zIndex || 2
			}).add(), a.labelGroup = c.g("axis-labels").attr({
				zIndex: s.zIndex || 7
			}).add();
			if (b || a.isLinked) n(e, function(b) {
				f[b] ? f[b].addLabel() : f[b] = new Ja(a, b)
			}), n(e, function(a) {
				if (h === 0 || h === 2 || {
					1: "left",
					3: "right"
				}[h] === s.align) t = q(f[a].getLabelSize(), t)
			}), a.staggerLines && (t += (a.staggerLines - 1) * 16);
			else
				for (v in f) f[v].destroy(), delete f[v]; if (p && p.text &&
				p.enabled !== !1) {
				if (!a.axisTitle) a.axisTitle = c.text(p.text, 0, 0, p.useHTML).attr({
					zIndex: 7,
					rotation: p.rotation || 0,
					align: p.textAlign || {
						low: "left",
						middle: "center",
						high: "right"
					}[p.align]
				}).css(p.style).add(a.axisGroup), a.axisTitle.isNew = !0;
				if (j) k = a.axisTitle.getBBox()[g ? "height" : "width"], l = o(p.margin, g ? 5 : 10), m = p.offset;
				a.axisTitle[j ? "show" : "hide"]()
			}
			a.offset = G * o(d.offset, B[h]);
			a.axisTitleMargin = o(m, t + l + (h !== 2 && t && G * d.labels[g ? "y" : "x"]));
			B[h] = q(B[h], a.axisTitleMargin + k + G * a.offset);
			w[i] = q(w[i], d.lineWidth)
		},
		getLinePath: function(a) {
			var b = this.chart,
				c = this.opposite,
				d = this.offset,
				e = this.horiz,
				f = this.left + (c ? this.width : 0) + d;
			this.lineTop = d = b.chartHeight - this.bottom - (c ? this.height : 0) + d;
			c || (a *= -1);
			return b.renderer.crispLine(["M", e ? this.left : f, e ? d : this.top, "L", e ? b.chartWidth - this.right : f, e ? d : b.chartHeight - this.bottom], a)
		},
		getTitlePosition: function() {
			var a = this.horiz,
				b = this.left,
				c = this.top,
				d = this.len,
				e = this.options.title,
				f = a ? b : c,
				g = this.opposite,
				h = this.offset,
				i = u(e.style.fontSize || 12),
				d = {
					low: f + (a ? 0 : d),
					middle: f +
						d / 2,
					high: f + (a ? d : 0)
				}[e.align],
				b = (a ? c + this.height : b) + (a ? 1 : -1) * (g ? -1 : 1) * this.axisTitleMargin + (this.side === 2 ? i : 0);
			return {
				x: a ? d : b + (g ? this.width : 0) + h + (e.x || 0),
				y: a ? b - (g ? this.height : 0) + h : d + (e.y || 0)
			}
		},
		render: function() {
			var a = this,
				b = a.chart,
				c = b.renderer,
				d = a.options,
				e = a.isLog,
				f = a.isLinked,
				g = a.tickPositions,
				h = a.axisTitle,
				i = a.stacks,
				j = a.ticks,
				k = a.minorTicks,
				m = a.alternateBands,
				l = d.stackLabels,
				p = d.alternateGridColor,
				s = a.tickmarkOffset,
				o = d.lineWidth,
				B, w = b.hasRendered && r(a.oldMin) && !isNaN(a.oldMin);
			B = a.hasData;
			var q =
				a.showAxis,
				t, v;
			n([j, k, m], function(a) {
				for (var b in a) a[b].isActive = !1
			});
			if (B || f)
				if (a.minorTickInterval && !a.categories && n(a.getMinorTickPositions(), function(b) {
						k[b] || (k[b] = new Ja(a, b, "minor"));
						w && k[b].isNew && k[b].render(null, !0);
						k[b].render(null, !1, 1)
					}), g.length && (n(g.slice(1).concat([g[0]]), function(b, c) {
						c = c === g.length - 1 ? 0 : c + 1;
						if (!f || b >= a.min && b <= a.max) j[b] || (j[b] = new Ja(a, b)), w && j[b].isNew && j[b].render(c, !0), j[b].render(c, !1, 1)
					}), s && a.min === 0 && (j[-1] || (j[-1] = new Ja(a, -1, null, !0)), j[-1].render(-1))),
					p && n(g, function(b, c) {
						if (c % 2 === 0 && b < a.max) m[b] || (m[b] = new pb(a)), t = b + s, v = g[c + 1] !== y ? g[c + 1] + s : a.max, m[b].options = {
							from: e ? da(t) : t,
							to: e ? da(v) : v,
							color: p
						}, m[b].render(), m[b].isActive = !0
					}), !a._addedPlotLB) n((d.plotLines || []).concat(d.plotBands || []), function(b) {
					a.addPlotBandOrLine(b)
				}), a._addedPlotLB = !0;
			n([j, k, m], function(a) {
				var c, d, e = [],
					f = za ? za.duration || 500 : 0,
					g = function() {
						for (d = e.length; d--;) a[e[d]] && !a[e[d]].isActive && (a[e[d]].destroy(), delete a[e[d]])
					};
				for (c in a)
					if (!a[c].isActive) a[c].render(c, !1, 0),
						a[c].isActive = !1, e.push(c);
				a === m || !b.hasRendered || !f ? g() : f && setTimeout(g, f)
			});
			if (o) B = a.getLinePath(o), a.axisLine ? a.axisLine.animate({
				d: B
			}) : a.axisLine = c.path(B).attr({
				stroke: d.lineColor,
				"stroke-width": o,
				zIndex: 7
			}).add(a.axisGroup), a.axisLine[q ? "show" : "hide"]();
			if (h && q) h[h.isNew ? "attr" : "animate"](a.getTitlePosition()), h.isNew = !1;
			if (l && l.enabled) {
				var u, x, d = a.stackTotalGroup;
				if (!d) a.stackTotalGroup = d = c.g("stack-labels").attr({
					visibility: "visible",
					zIndex: 6
				}).add();
				d.translate(b.plotLeft, b.plotTop);
				for (u in i)
					for (x in c =
						i[u], c) c[x].render(d)
			}
			a.isDirty = !1
		},
		removePlotBandOrLine: function(a) {
			for (var b = this.plotLinesAndBands, c = b.length; c--;) b[c].id === a && b[c].destroy()
		},
		setTitle: function(a, b) {
			this.update({
				title: a
			}, b)
		},
		redraw: function() {
			var a = this.chart.pointer;
			a.reset && a.reset(!0);
			this.render();
			n(this.plotLinesAndBands, function(a) {
				a.render()
			});
			n(this.series, function(a) {
				a.isDirty = !0
			})
		},
		setCategories: function(a, b) {
			this.update({
				categories: a
			}, b)
		},
		destroy: function() {
			var a = this,
				b = a.stacks,
				c;
			ba(a);
			for (c in b) Ha(b[c]), b[c] = null;
			n([a.ticks, a.minorTicks, a.alternateBands, a.plotLinesAndBands], function(a) {
				Ha(a)
			});
			n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","), function(b) {
				a[b] && (a[b] = a[b].destroy())
			})
		}
	};
	qb.prototype = {
		init: function(a, b) {
			var c = b.borderWidth,
				d = b.style,
				e = u(d.padding);
			this.chart = a;
			this.options = b;
			this.crosshairs = [];
			this.now = {
				x: 0,
				y: 0
			};
			this.isHidden = !0;
			this.label = a.renderer.label("", 0, 0, b.shape, null, null, b.useHTML, null, "tooltip").attr({
				padding: e,
				fill: b.backgroundColor,
				"stroke-width": c,
				r: b.borderRadius,
				zIndex: 8
			}).css(d).css({
				padding: 0
			}).hide().add();
			$ || this.label.shadow(b.shadow);
			this.shared = b.shared
		},
		destroy: function() {
			n(this.crosshairs, function(a) {
				a && a.destroy()
			});
			if (this.label) this.label = this.label.destroy();
			clearTimeout(this.hideTimer);
			clearTimeout(this.tooltipTimeout)
		},
		move: function(a, b, c, d) {
			var e = this,
				f = e.now,
				g = e.options.animation !== !1 && !e.isHidden;
			v(f, {
				x: g ? (2 * f.x + a) / 3 : a,
				y: g ? (f.y + b) / 2 : b,
				anchorX: g ? (2 * f.anchorX + c) / 3 : c,
				anchorY: g ? (f.anchorY + d) / 2 : d
			});
			e.label.attr(f);
			if (g && (Q(a -
				f.x) > 1 || Q(b - f.y) > 1)) clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function() {
				e && e.move(a, b, c, d)
			}, 32)
		},
		hide: function() {
			var a = this,
				b;
			clearTimeout(this.hideTimer);
			if (!this.isHidden) b = this.chart.hoverPoints, this.hideTimer = setTimeout(function() {
				a.label.fadeOut();
				a.isHidden = !0
			}, o(this.options.hideDelay, 500)), b && n(b, function(a) {
				a.setState()
			}), this.chart.hoverPoints = null
		},
		hideCrosshairs: function() {
			n(this.crosshairs, function(a) {
				a && a.hide()
			})
		},
		getAnchor: function(a, b) {
			var c, d = this.chart,
				e =
				d.inverted,
				f = d.plotTop,
				g = 0,
				h = 0,
				i, a = ha(a);
			c = a[0].tooltipPos;
			this.followPointer && b && (b.chartX === y && (b = d.pointer.normalize(b)), c = [b.chartX - d.plotLeft, b.chartY - f]);
			c || (n(a, function(a) {
				i = a.series.yAxis;
				g += a.plotX;
				h += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!e && i ? i.top - f : 0)
			}), g /= a.length, h /= a.length, c = [e ? d.plotWidth - h : g, this.shared && !e && a.length > 1 && b ? b.chartY - f : e ? d.plotHeight - g : h]);
			return La(c, t)
		},
		getPosition: function(a, b, c) {
			var d = this.chart,
				e = d.plotLeft,
				f = d.plotTop,
				g = d.plotWidth,
				h = d.plotHeight,
				i =
				o(this.options.distance, 12),
				j = c.plotX,
				c = c.plotY,
				d = j + e + (d.inverted ? i : -a - i),
				k = c - b + f + 15,
				m;
			d < 7 && (d = e + q(j, 0) + i);
			d + a > e + g && (d -= d + a - (e + g), k = c - b + f - i, m = !0);
			k < f + 5 && (k = f + 5, m && c >= k && c <= k + b && (k = c + f + i));
			k + b > f + h && (k = q(f, f + h - b - i));
			return {
				x: d,
				y: k
			}
		},
		defaultFormatter: function(a) {
			var b = this.points || ha(this),
				c = b[0].series,
				d;
			d = [c.tooltipHeaderFormatter(b[0])];
			n(b, function(a) {
				c = a.series;
				d.push(c.tooltipFormatter && c.tooltipFormatter(a) || a.point.tooltipFormatter(c.tooltipOptions.pointFormat))
			});
			d.push(a.options.footerFormat ||
				"");
			return d.join("")
		},
		refresh: function(a, b) {
			var c = this.chart,
				d = this.label,
				e = this.options,
				f, g, h, i = {},
				j, k = [];
			j = e.formatter || this.defaultFormatter;
			var i = c.hoverPoints,
				m, l = e.crosshairs;
			h = this.shared;
			clearTimeout(this.hideTimer);
			this.followPointer = ha(a)[0].series.tooltipOptions.followPointer;
			g = this.getAnchor(a, b);
			f = g[0];
			g = g[1];
			h && (!a.series || !a.series.noSharedTooltip) ? (c.hoverPoints = a, i && n(i, function(a) {
				a.setState()
			}), n(a, function(a) {
				a.setState("hover");
				k.push(a.getLabelConfig())
			}), i = {
				x: a[0].category,
				y: a[0].y
			}, i.points = k, a = a[0]) : i = a.getLabelConfig();
			j = j.call(i, this);
			i = a.series;
			h = h || !i.isCartesian || i.tooltipOutsidePlot || c.isInsidePlot(f, g);
			j === !1 || !h ? this.hide() : (this.isHidden && (Ta(d), d.attr("opacity", 1).show()), d.attr({
				text: j
			}), m = e.borderColor || a.color || i.color || "#606060", d.attr({
				stroke: m
			}), this.updatePosition({
				plotX: f,
				plotY: g
			}), this.isHidden = !1);
			if (l) {
				l = ha(l);
				for (d = l.length; d--;)
					if (e = a.series[d ? "yAxis" : "xAxis"], l[d] && e)
						if (h = d ? o(a.stackY, a.y) : a.x, e.isLog && (h = ka(h)), e = e.getPlotLinePath(h, 1), this.crosshairs[d]) this.crosshairs[d].attr({
							d: e,
							visibility: "visible"
						});
						else {
							h = {
								"stroke-width": l[d].width || 1,
								stroke: l[d].color || "#C0C0C0",
								zIndex: l[d].zIndex || 2
							};
							if (l[d].dashStyle) h.dashstyle = l[d].dashStyle;
							this.crosshairs[d] = c.renderer.path(e).attr(h).add()
						}
			}
			D(c, "tooltipRefresh", {
				text: j,
				x: f + c.plotLeft,
				y: g + c.plotTop,
				borderColor: m
			})
		},
		updatePosition: function(a) {
			var b = this.chart,
				c = this.label,
				c = (this.options.positioner || this.getPosition).call(this, c.width, c.height, a);
			this.move(t(c.x), t(c.y), a.plotX + b.plotLeft, a.plotY + b.plotTop)
		}
	};
	rb.prototype = {
		init: function(a,
			b) {
			var c = $ ? "" : b.chart.zoomType,
				d = a.inverted,
				e;
			this.options = b;
			this.chart = a;
			this.zoomX = e = /x/.test(c);
			this.zoomY = c = /y/.test(c);
			this.zoomHor = e && !d || c && d;
			this.zoomVert = c && !d || e && d;
			this.pinchDown = [];
			this.lastValidTouch = {};
			if (b.tooltip.enabled) a.tooltip = new qb(a, b.tooltip);
			this.setDOMEvents()
		},
		normalize: function(a) {
			var b, c, d, a = a || O.event;
			if (!a.target) a.target = a.srcElement;
			a = Qb(a);
			d = a.touches ? a.touches.item(0) : a;
			this.chartPosition = b = Ub(this.chart.container);
			d.pageX === y ? (c = a.x, b = a.y) : (c = d.pageX - b.left, b = d.pageY -
				b.top);
			return v(a, {
				chartX: t(c),
				chartY: t(b)
			})
		},
		getCoordinates: function(a) {
			var b = {
				xAxis: [],
				yAxis: []
			};
			n(this.chart.axes, function(c) {
				b[c.isXAxis ? "xAxis" : "yAxis"].push({
					axis: c,
					value: c.toValue(a[c.horiz ? "chartX" : "chartY"])
				})
			});
			return b
		},
		getIndex: function(a) {
			var b = this.chart;
			return b.inverted ? b.plotHeight + b.plotTop - a.chartY : a.chartX - b.plotLeft
		},
		runPointActions: function(a) {
			var b = this.chart,
				c = b.series,
				d = b.tooltip,
				e, f = b.hoverPoint,
				g = b.hoverSeries,
				h, i, j = b.chartWidth,
				k = this.getIndex(a);
			if (d && this.options.tooltip.shared &&
				(!g || !g.noSharedTooltip)) {
				e = [];
				h = c.length;
				for (i = 0; i < h; i++)
					if (c[i].visible && c[i].options.enableMouseTracking !== !1 && !c[i].noSharedTooltip && c[i].tooltipPoints.length && (b = c[i].tooltipPoints[k], b.series)) b._dist = Q(k - b.clientX), j = K(j, b._dist), e.push(b);
				for (h = e.length; h--;) e[h]._dist > j && e.splice(h, 1);
				if (e.length && e[0].clientX !== this.hoverX) d.refresh(e, a), this.hoverX = e[0].clientX
			}
			if (g && g.tracker) {
				if ((b = g.tooltipPoints[k]) && b !== f) b.onMouseOver(a)
			} else d && d.followPointer && !d.isHidden && (a = d.getAnchor([{}], a),
				d.updatePosition({
					plotX: a[0],
					plotY: a[1]
				}))
		},
		reset: function(a) {
			var b = this.chart,
				c = b.hoverSeries,
				d = b.hoverPoint,
				e = b.tooltip,
				b = e && e.shared ? b.hoverPoints : d;
			(a = a && e && b) && ha(b)[0].plotX === y && (a = !1);
			if (a) e.refresh(b);
			else {
				if (d) d.onMouseOut();
				if (c) c.onMouseOut();
				e && (e.hide(), e.hideCrosshairs());
				this.hoverX = null
			}
		},
		scaleGroups: function(a, b) {
			var c = this.chart;
			n(c.series, function(d) {
				d.xAxis && d.xAxis.zoomEnabled && (d.group.attr(a), d.markerGroup && (d.markerGroup.attr(a), d.markerGroup.clip(b ? c.clipRect : null)), d.dataLabelsGroup &&
					d.dataLabelsGroup.attr(a))
			});
			c.clipRect.attr(b || c.clipBox)
		},
		pinchTranslateDirection: function(a, b, c, d, e, f, g) {
			var h = this.chart,
				i = a ? "x" : "y",
				j = a ? "X" : "Y",
				k = "chart" + j,
				m = a ? "width" : "height",
				l = h["plot" + (a ? "Left" : "Top")],
				p, s, o = 1,
				n = h.inverted,
				w = h.bounds[a ? "h" : "v"],
				q = b.length === 1,
				t = b[0][k],
				r = c[0][k],
				v = !q && b[1][k],
				u = !q && c[1][k],
				x, c = function() {
					!q && Q(t - v) > 20 && (o = Q(r - u) / Q(t - v));
					s = (l - r) / o + t;
					p = h["plot" + (a ? "Width" : "Height")] / o
				};
			c();
			b = s;
			b < w.min ? (b = w.min, x = !0) : b + p > w.max && (b = w.max - p, x = !0);
			x ? (r -= 0.8 * (r - g[i][0]), q || (u -=
				0.8 * (u - g[i][1])), c()) : g[i] = [r, u];
			n || (f[i] = s - l, f[m] = p);
			f = n ? 1 / o : o;
			e[m] = p;
			e[i] = b;
			d[n ? a ? "scaleY" : "scaleX" : "scale" + j] = o;
			d["translate" + j] = f * l + (r - f * t)
		},
		pinch: function(a) {
			var b = this,
				c = b.chart,
				d = b.pinchDown,
				e = c.tooltip && c.tooltip.options.followTouchMove,
				f = a.touches,
				g = f.length,
				h = b.lastValidTouch,
				i = b.zoomHor || b.pinchHor,
				j = b.zoomVert || b.pinchVert,
				k = i || j,
				m = b.selectionMarker,
				l = {},
				p = {};
			a.type === "touchstart" && (e || k) && a.preventDefault();
			La(f, function(a) {
				return b.normalize(a)
			});
			if (a.type === "touchstart") n(f, function(a,
				b) {
				d[b] = {
					chartX: a.chartX,
					chartY: a.chartY
				}
			}), h.x = [d[0].chartX, d[1] && d[1].chartX], h.y = [d[0].chartY, d[1] && d[1].chartY], n(c.axes, function(a) {
				if (a.zoomEnabled) {
					var b = c.bounds[a.horiz ? "h" : "v"],
						d = a.minPixelPadding,
						e = a.toPixels(a.dataMin),
						f = a.toPixels(a.dataMax),
						g = K(e, f),
						e = q(e, f);
					b.min = K(a.pos, g - d);
					b.max = q(a.pos + a.len, e + d)
				}
			});
			else if (d.length) {
				if (!m) b.selectionMarker = m = v({
					destroy: ta
				}, c.plotBox);
				i && b.pinchTranslateDirection(!0, d, f, l, m, p, h);
				j && b.pinchTranslateDirection(!1, d, f, l, m, p, h);
				b.hasPinched = k;
				b.scaleGroups(l,
					p);
				!k && e && g === 1 && this.runPointActions(b.normalize(a))
			}
		},
		dragStart: function(a) {
			var b = this.chart;
			b.mouseIsDown = a.type;
			b.cancelClick = !1;
			b.mouseDownX = this.mouseDownX = a.chartX;
			this.mouseDownY = a.chartY
		},
		drag: function(a) {
			var b = this.chart,
				c = b.options.chart,
				d = a.chartX,
				a = a.chartY,
				e = this.zoomHor,
				f = this.zoomVert,
				g = b.plotLeft,
				h = b.plotTop,
				i = b.plotWidth,
				j = b.plotHeight,
				k, m = this.mouseDownX,
				l = this.mouseDownY;
			d < g ? d = g : d > g + i && (d = g + i);
			a < h ? a = h : a > h + j && (a = h + j);
			this.hasDragged = Math.sqrt(Math.pow(m - d, 2) + Math.pow(l - a, 2));
			if (this.hasDragged >
				10) {
				k = b.isInsidePlot(m - g, l - h);
				if (b.hasCartesianSeries && (this.zoomX || this.zoomY) && k && !this.selectionMarker) this.selectionMarker = b.renderer.rect(g, h, e ? 1 : i, f ? 1 : j, 0).attr({
					fill: c.selectionMarkerFill || "rgba(69,114,167,0.25)",
					zIndex: 7
				}).add();
				this.selectionMarker && e && (e = d - m, this.selectionMarker.attr({
					width: Q(e),
					x: (e > 0 ? 0 : e) + m
				}));
				this.selectionMarker && f && (e = a - l, this.selectionMarker.attr({
					height: Q(e),
					y: (e > 0 ? 0 : e) + l
				}));
				k && !this.selectionMarker && c.panning && b.pan(d)
			}
		},
		drop: function(a) {
			var b = this.chart,
				c = this.hasPinched;
			if (this.selectionMarker) {
				var d = {
						xAxis: [],
						yAxis: [],
						originalEvent: a.originalEvent || a
					},
					e = this.selectionMarker,
					f = e.x,
					g = e.y,
					h;
				if (this.hasDragged || c) n(b.axes, function(a) {
					if (a.zoomEnabled) {
						var b = a.horiz,
							c = a.toValue(b ? f : g),
							b = a.toValue(b ? f + e.width : g + e.height);
						!isNaN(c) && !isNaN(b) && (d[a.xOrY + "Axis"].push({
							axis: a,
							min: K(c, b),
							max: q(c, b)
						}), h = !0)
					}
				}), h && D(b, "selection", d, function(a) {
					b.zoom(v(a, c ? {
						animation: !1
					} : null))
				});
				this.selectionMarker = this.selectionMarker.destroy();
				c && this.scaleGroups({
					translateX: b.plotLeft,
					translateY: b.plotTop,
					scaleX: 1,
					scaleY: 1
				})
			}
			if (b) L(b.container, {
				cursor: b._cursor
			}), b.cancelClick = this.hasDragged > 10, b.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = []
		},
		onContainerMouseDown: function(a) {
			a = this.normalize(a);
			a.preventDefault && a.preventDefault();
			this.dragStart(a)
		},
		onDocumentMouseUp: function(a) {
			this.drop(a)
		},
		onDocumentMouseMove: function(a) {
			var b = this.chart,
				c = this.chartPosition,
				d = b.hoverSeries,
				a = Qb(a);
			c && d && d.isCartesian && !b.isInsidePlot(a.pageX - c.left - b.plotLeft, a.pageY - c.top -
				b.plotTop) && this.reset()
		},
		onContainerMouseLeave: function() {
			this.reset();
			this.chartPosition = null
		},
		onContainerMouseMove: function(a) {
			var b = this.chart,
				a = this.normalize(a);
			a.returnValue = !1;
			b.mouseIsDown === "mousedown" && this.drag(a);
			b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) && !b.openMenu && this.runPointActions(a)
		},
		inClass: function(a, b) {
			for (var c; a;) {
				if (c = A(a, "class"))
					if (c.indexOf(b) !== -1) return !0;
					else if (c.indexOf("highcharts-container") !== -1) return !1;
				a = a.parentNode
			}
		},
		onTrackerMouseOut: function(a) {
			var b =
				this.chart.hoverSeries;
			if (b && !b.options.stickyTracking && !this.inClass(a.toElement || a.relatedTarget, "highcharts-tooltip")) b.onMouseOut()
		},
		onContainerClick: function(a) {
			var b = this.chart,
				c = b.hoverPoint,
				d = b.plotLeft,
				e = b.plotTop,
				f = b.inverted,
				g, h, i, a = this.normalize(a);
			a.cancelBubble = !0;
			if (!b.cancelClick) c && this.inClass(a.target, "highcharts-tracker") ? (g = this.chartPosition, h = c.plotX, i = c.plotY, v(c, {
					pageX: g.left + d + (f ? b.plotWidth - i : h),
					pageY: g.top + e + (f ? b.plotHeight - h : i)
				}), D(c.series, "click", v(a, {
					point: c
				})), b.hoverPoint &&
				c.firePointEvent("click", a)) : (v(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - d, a.chartY - e) && D(b, "click", a))
		},
		onContainerTouchStart: function(a) {
			var b = this.chart;
			a.touches.length === 1 ? (a = this.normalize(a), b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) && (this.runPointActions(a), this.pinch(a))) : a.touches.length === 2 && this.pinch(a)
		},
		onContainerTouchMove: function(a) {
			(a.touches.length === 1 || a.touches.length === 2) && this.pinch(a)
		},
		onDocumentTouchEnd: function(a) {
			this.drop(a)
		},
		setDOMEvents: function() {
			var a =
				this,
				b = a.chart.container,
				c;
			this._events = c = [
				[b, "onmousedown", "onContainerMouseDown"],
				[b, "onmousemove", "onContainerMouseMove"],
				[b, "onclick", "onContainerClick"],
				[b, "mouseleave", "onContainerMouseLeave"],
				[z, "mousemove", "onDocumentMouseMove"],
				[z, "mouseup", "onDocumentMouseUp"]
			];
			fb && c.push([b, "ontouchstart", "onContainerTouchStart"], [b, "ontouchmove", "onContainerTouchMove"], [z, "touchend", "onDocumentTouchEnd"]);
			n(c, function(b) {
				a["_" + b[2]] = function(c) {
					a[b[2]](c)
				};
				b[1].indexOf("on") === 0 ? b[0][b[1]] = a["_" + b[2]] :
					J(b[0], b[1], a["_" + b[2]])
			})
		},
		destroy: function() {
			var a = this;
			n(a._events, function(b) {
				b[1].indexOf("on") === 0 ? b[0][b[1]] = null : ba(b[0], b[1], a["_" + b[2]])
			});
			delete a._events;
			clearInterval(a.tooltipTimeout)
		}
	};
	sb.prototype = {
		init: function(a, b) {
			var c = this,
				d = b.itemStyle,
				e = o(b.padding, 8),
				f = b.itemMarginTop || 0;
			this.options = b;
			if (b.enabled) c.baseline = u(d.fontSize) + 3 + f, c.itemStyle = d, c.itemHiddenStyle = x(d, b.itemHiddenStyle), c.itemMarginTop = f, c.padding = e, c.initialItemX = e, c.initialItemY = e - 5, c.maxItemWidth = 0, c.chart = a,
				c.itemHeight = 0, c.lastLineHeight = 0, c.render(), J(c.chart, "endResize", function() {
					c.positionCheckboxes()
				})
		},
		colorizeItem: function(a, b) {
			var c = this.options,
				d = a.legendItem,
				e = a.legendLine,
				f = a.legendSymbol,
				g = this.itemHiddenStyle.color,
				c = b ? c.itemStyle.color : g,
				h = b ? a.color : g,
				g = a.options && a.options.marker,
				i = {
					stroke: h,
					fill: h
				},
				j;
			d && d.css({
				fill: c,
				color: c
			});
			e && e.attr({
				stroke: h
			});
			if (f) {
				if (g)
					for (j in g = a.convertAttribs(g), g) d = g[j], d !== y && (i[j] = d);
				f.attr(i)
			}
		},
		positionItem: function(a) {
			var b = this.options,
				c = b.symbolPadding,
				b = !b.rtl,
				d = a._legendItemPos,
				e = d[0],
				d = d[1],
				f = a.checkbox;
			a.legendGroup && a.legendGroup.translate(b ? e : this.legendWidth - e - 2 * c - 4, d);
			if (f) f.x = e, f.y = d
		},
		destroyItem: function(a) {
			var b = a.checkbox;
			n(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function(b) {
				a[b] && a[b].destroy()
			});
			b && Ra(a.checkbox)
		},
		destroy: function() {
			var a = this.group,
				b = this.box;
			if (b) this.box = b.destroy();
			if (a) this.group = a.destroy()
		},
		positionCheckboxes: function(a) {
			var b = this.group.alignAttr,
				c, d = this.clipHeight || this.legendHeight;
			if (b) c =
				b.translateY, n(this.allItems, function(e) {
					var f = e.checkbox,
						g;
					f && (g = c + f.y + (a || 0) + 3, L(f, {
						left: b.translateX + e.legendItemWidth + f.x - 20 + "px",
						top: g + "px",
						display: g > c - 6 && g < c + d - 6 ? "" : S
					}))
				})
		},
		renderTitle: function() {
			var a = this.padding,
				b = this.options.title,
				c = 0;
			if (b.text) {
				if (!this.title) this.title = this.chart.renderer.label(b.text, a - 3, a - 4, null, null, null, null, null, "legend-title").attr({
					zIndex: 1
				}).css(b.style).add(this.group);
				c = this.title.getBBox().height;
				this.contentGroup.attr({
					translateY: c
				})
			}
			this.titleHeight = c
		},
		renderItem: function(a) {
			var w;
			var b = this,
				c = b.chart,
				d = c.renderer,
				e = b.options,
				f = e.layout === "horizontal",
				g = e.symbolWidth,
				h = e.symbolPadding,
				i = b.itemStyle,
				j = b.itemHiddenStyle,
				k = b.padding,
				m = !e.rtl,
				l = e.width,
				p = e.itemMarginBottom || 0,
				s = b.itemMarginTop,
				o = b.initialItemX,
				n = a.legendItem,
				t = a.series || a,
				r = t.options,
				v = r.showCheckbox,
				u = e.useHTML;
			if (!n && (a.legendGroup = d.g("legend-item").attr({
				zIndex: 1
			}).add(b.scrollGroup), t.drawLegendSymbol(b, a), a.legendItem = n = d.text(e.labelFormat ? wa(e.labelFormat, a) : e.labelFormatter.call(a), m ? g + h : -h, b.baseline,
				u).css(x(a.visible ? i : j)).attr({
				align: m ? "left" : "right",
				zIndex: 2
			}).add(a.legendGroup), (u ? n : a.legendGroup).on("mouseover", function() {
				a.setState("hover");
				n.css(b.options.itemHoverStyle)
			}).on("mouseout", function() {
				n.css(a.visible ? i : j);
				a.setState()
			}).on("click", function(b) {
				var c = function() {
						a.setVisible()
					},
					b = {
						browserEvent: b
					};
				a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : D(a, "legendItemClick", b, c)
			}), b.colorizeItem(a, a.visible), r && v)) a.checkbox = U("input", {
					type: "checkbox",
					checked: a.selected,
					defaultChecked: a.selected
				},
				e.itemCheckboxStyle, c.container), J(a.checkbox, "click", function(b) {
				D(a, "checkboxClick", {
					checked: b.target.checked
				}, function() {
					a.select()
				})
			});
			d = n.getBBox();
			w = a.legendItemWidth = e.itemWidth || g + h + d.width + k + (v ? 20 : 0), e = w;
			b.itemHeight = g = d.height;
			if (f && b.itemX - o + e > (l || c.chartWidth - 2 * k - o)) b.itemX = o, b.itemY += s + b.lastLineHeight + p, b.lastLineHeight = 0;
			b.maxItemWidth = q(b.maxItemWidth, e);
			b.lastItemY = s + b.itemY + p;
			b.lastLineHeight = q(g, b.lastLineHeight);
			a._legendItemPos = [b.itemX, b.itemY];
			f ? b.itemX += e : (b.itemY += s + g + p, b.lastLineHeight =
				g);
			b.offsetWidth = l || q(f ? b.itemX - o : e, b.offsetWidth)
		},
		render: function() {
			var a = this,
				b = a.chart,
				c = b.renderer,
				d = a.group,
				e, f, g, h, i = a.box,
				j = a.options,
				k = a.padding,
				m = j.borderWidth,
				l = j.backgroundColor;
			a.itemX = a.initialItemX;
			a.itemY = a.initialItemY;
			a.offsetWidth = 0;
			a.lastItemY = 0;
			if (!d) a.group = d = c.g("legend").attr({
				zIndex: 7
			}).add(), a.contentGroup = c.g().attr({
				zIndex: 1
			}).add(d), a.scrollGroup = c.g().add(a.contentGroup);
			a.renderTitle();
			e = [];
			n(b.series, function(a) {
				var b = a.options;
				b.showInLegend && !r(b.linkedTo) && (e = e.concat(a.legendItems ||
					(b.legendType === "point" ? a.data : a)))
			});
			Ib(e, function(a, b) {
				return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0)
			});
			j.reversed && e.reverse();
			a.allItems = e;
			a.display = f = !!e.length;
			n(e, function(b) {
				a.renderItem(b)
			});
			g = j.width || a.offsetWidth;
			h = a.lastItemY + a.lastLineHeight + a.titleHeight;
			h = a.handleOverflow(h);
			if (m || l) {
				g += k;
				h += k;
				if (i) {
					if (g > 0 && h > 0) i[i.isNew ? "attr" : "animate"](i.crisp(null, null, null, g, h)), i.isNew = !1
				} else a.box = i = c.rect(0, 0, g, h, j.borderRadius, m || 0).attr({
					stroke: j.borderColor,
					"stroke-width": m || 0,
					fill: l || S
				}).add(d).shadow(j.shadow), i.isNew = !0;
				i[f ? "show" : "hide"]()
			}
			a.legendWidth = g;
			a.legendHeight = h;
			n(e, function(b) {
				a.positionItem(b)
			});
			f && d.align(v({
				width: g,
				height: h
			}, j), !0, "spacingBox");
			b.isResizing || this.positionCheckboxes()
		},
		handleOverflow: function(a) {
			var b = this,
				c = this.chart,
				d = c.renderer,
				e = this.options,
				f = e.y,
				f = c.spacingBox.height + (e.verticalAlign === "top" ? -f : f) - this.padding,
				g = e.maxHeight,
				h = this.clipRect,
				i = e.navigation,
				j = o(i.animation, !0),
				k = i.arrowSize || 12,
				m = this.nav;
			e.layout ===
				"horizontal" && (f /= 2);
			g && (f = K(f, g));
			if (a > f && !e.useHTML) {
				this.clipHeight = c = f - 20 - this.titleHeight;
				this.pageCount = ja(a / c);
				this.currentPage = o(this.currentPage, 1);
				this.fullHeight = a;
				if (!h) h = b.clipRect = d.clipRect(0, 0, 9999, 0), b.contentGroup.clip(h);
				h.attr({
					height: c
				});
				if (!m) this.nav = m = d.g().attr({
					zIndex: 1
				}).add(this.group), this.up = d.symbol("triangle", 0, 0, k, k).on("click", function() {
					b.scroll(-1, j)
				}).add(m), this.pager = d.text("", 15, 10).css(i.style).add(m), this.down = d.symbol("triangle-down", 0, 0, k, k).on("click",
					function() {
						b.scroll(1, j)
					}).add(m);
				b.scroll(0);
				a = f
			} else if (m) h.attr({
				height: c.chartHeight
			}), m.hide(), this.scrollGroup.attr({
				translateY: 1
			}), this.clipHeight = 0;
			return a
		},
		scroll: function(a, b) {
			var c = this.pageCount,
				d = this.currentPage + a,
				e = this.clipHeight,
				f = this.options.navigation,
				g = f.activeColor,
				h = f.inactiveColor,
				f = this.pager,
				i = this.padding;
			d > c && (d = c);
			if (d > 0) b !== y && Ia(b, this.chart), this.nav.attr({
				translateX: i,
				translateY: e + 7 + this.titleHeight,
				visibility: "visible"
			}), this.up.attr({
				fill: d === 1 ? h : g
			}).css({
				cursor: d ===
					1 ? "default" : "pointer"
			}), f.attr({
				text: d + "/" + this.pageCount
			}), this.down.attr({
				x: 18 + this.pager.getBBox().width,
				fill: d === c ? h : g
			}).css({
				cursor: d === c ? "default" : "pointer"
			}), e = -K(e * (d - 1), this.fullHeight - e + i) + 1, this.scrollGroup.animate({
				translateY: e
			}), f.attr({
				text: d + "/" + c
			}), this.currentPage = d, this.positionCheckboxes(e)
		}
	};
	tb.prototype = {
		init: function(a, b) {
			var c, d = a.series;
			a.series = null;
			c = x(N, a);
			c.series = a.series = d;
			var d = c.chart,
				e = d.margin,
				e = V(e) ? e : [e, e, e, e];
			this.optionsMarginTop = o(d.marginTop, e[0]);
			this.optionsMarginRight =
				o(d.marginRight, e[1]);
			this.optionsMarginBottom = o(d.marginBottom, e[2]);
			this.optionsMarginLeft = o(d.marginLeft, e[3]);
			this.runChartClick = (e = d.events) && !!e.click;
			this.bounds = {
				h: {},
				v: {}
			};
			this.callback = b;
			this.isResizing = 0;
			this.options = c;
			this.axes = [];
			this.series = [];
			this.hasCartesianSeries = d.showAxes;
			var f = this,
				g;
			f.index = Ba.length;
			Ba.push(f);
			d.reflow !== !1 && J(f, "load", function() {
				f.initReflow()
			});
			if (e)
				for (g in e) J(f, g, e[g]);
			f.xAxis = [];
			f.yAxis = [];
			f.animation = $ ? !1 : o(d.animation, !0);
			f.pointCount = 0;
			f.counters = new Hb;
			f.firstRender()
		},
		initSeries: function(a) {
			var b = this.options.chart;
			(b = aa[a.type || b.type || b.defaultSeriesType]) || qa(17, !0);
			b = new b;
			b.init(this, a);
			return b
		},
		addSeries: function(a, b, c) {
			var d, e = this;
			a && (b = o(b, !0), D(e, "addSeries", {
				options: a
			}, function() {
				d = e.initSeries(a);
				e.isDirtyLegend = !0;
				b && e.redraw(c)
			}));
			return d
		},
		addAxis: function(a, b, c, d) {
			var b = b ? "xAxis" : "yAxis",
				e = this.options;
			new ab(this, x(a, {
				index: this[b].length
			}));
			e[b] = ha(e[b] || {});
			e[b].push(a);
			o(c, !0) && this.redraw(d)
		},
		isInsidePlot: function(a, b, c) {
			var d =
				c ? b : a,
				a = c ? a : b;
			return d >= 0 && d <= this.plotWidth && a >= 0 && a <= this.plotHeight
		},
		adjustTickAmounts: function() {
			this.options.chart.alignTicks !== !1 && n(this.axes, function(a) {
				a.adjustTickAmount()
			});
			this.maxTicks = null
		},
		redraw: function(a) {
			var b = this.axes,
				c = this.series,
				d = this.pointer,
				e = this.legend,
				f = this.isDirtyLegend,
				g, h = this.isDirtyBox,
				i = c.length,
				j = i,
				k = this.renderer,
				m = k.isHidden(),
				l = [];
			Ia(a, this);
			for (m && this.cloneRenderTo(); j--;)
				if (a = c[j], a.isDirty && a.options.stacking) {
					g = !0;
					break
				}
			if (g)
				for (j = i; j--;)
					if (a = c[j], a.options.stacking) a.isDirty = !0;
			n(c, function(a) {
				a.isDirty && a.options.legendType === "point" && (f = !0)
			});
			if (f && e.options.enabled) e.render(), this.isDirtyLegend = !1;
			if (this.hasCartesianSeries) {
				if (!this.isResizing) this.maxTicks = null, n(b, function(a) {
					a.setScale()
				});
				this.adjustTickAmounts();
				this.getMargins();
				n(b, function(a) {
					if (a.isDirtyExtremes) a.isDirtyExtremes = !1, l.push(function() {
						D(a, "afterSetExtremes", a.getExtremes())
					});
					if (a.isDirty || h || g) a.redraw(), h = !0
				})
			}
			h && this.drawChartBox();
			n(c, function(a) {
				a.isDirty && a.visible && (!a.isCartesian ||
					a.xAxis) && a.redraw()
			});
			d && d.reset && d.reset(!0);
			k.draw();
			D(this, "redraw");
			m && this.cloneRenderTo(!0);
			n(l, function(a) {
				a.call()
			})
		},
		showLoading: function(a) {
			var b = this.options,
				c = this.loadingDiv,
				d = b.loading;
			if (!c) this.loadingDiv = c = U(ya, {
				className: "highcharts-loading"
			}, v(d.style, {
				zIndex: 10,
				display: S
			}), this.container), this.loadingSpan = U("span", null, d.labelStyle, c);
			this.loadingSpan.innerHTML = a || b.lang.loading;
			if (!this.loadingShown) L(c, {
				opacity: 0,
				display: "",
				left: this.plotLeft + "px",
				top: this.plotTop + "px",
				width: this.plotWidth +
					"px",
				height: this.plotHeight + "px"
			}), wb(c, {
				opacity: d.style.opacity
			}, {
				duration: d.showDuration || 0
			}), this.loadingShown = !0
		},
		hideLoading: function() {
			var a = this.options,
				b = this.loadingDiv;
			b && wb(b, {
				opacity: 0
			}, {
				duration: a.loading.hideDuration || 100,
				complete: function() {
					L(b, {
						display: S
					})
				}
			});
			this.loadingShown = !1
		},
		get: function(a) {
			var b = this.axes,
				c = this.series,
				d, e;
			for (d = 0; d < b.length; d++)
				if (b[d].options.id === a) return b[d];
			for (d = 0; d < c.length; d++)
				if (c[d].options.id === a) return c[d];
			for (d = 0; d < c.length; d++) {
				e = c[d].points || [];
				for (b = 0; b < e.length; b++)
					if (e[b].id === a) return e[b]
			}
			return null
		},
		getAxes: function() {
			var a = this,
				b = this.options,
				c = b.xAxis = ha(b.xAxis || {}),
				b = b.yAxis = ha(b.yAxis || {});
			n(c, function(a, b) {
				a.index = b;
				a.isX = !0
			});
			n(b, function(a, b) {
				a.index = b
			});
			c = c.concat(b);
			n(c, function(b) {
				new ab(a, b)
			});
			a.adjustTickAmounts()
		},
		getSelectedPoints: function() {
			var a = [];
			n(this.series, function(b) {
				a = a.concat(ob(b.points || [], function(a) {
					return a.selected
				}))
			});
			return a
		},
		getSelectedSeries: function() {
			return ob(this.series, function(a) {
				return a.selected
			})
		},
		showResetZoom: function() {
			var a = this,
				b = N.lang,
				c = a.options.chart.resetZoomButton,
				d = c.theme,
				e = d.states,
				f = c.relativeTo === "chart" ? null : "plotBox";
			this.resetZoomButton = a.renderer.button(b.resetZoom, null, null, function() {
				a.zoomOut()
			}, d, e && e.hover).attr({
				align: c.position.align,
				title: b.resetZoomTitle
			}).add().align(c.position, !1, f)
		},
		zoomOut: function() {
			var a = this;
			D(a, "selection", {
				resetSelection: !0
			}, function() {
				a.zoom()
			})
		},
		zoom: function(a) {
			var b, c = this.pointer,
				d = !1,
				e;
			!a || a.resetSelection ? n(this.axes, function(a) {
				b =
					a.zoom()
			}) : n(a.xAxis.concat(a.yAxis), function(a) {
				var e = a.axis,
					h = e.isXAxis;
				if (c[h ? "zoomX" : "zoomY"] || c[h ? "pinchX" : "pinchY"]) b = e.zoom(a.min, a.max), e.displayBtn && (d = !0)
			});
			e = this.resetZoomButton;
			if (d && !e) this.showResetZoom();
			else if (!d && V(e)) this.resetZoomButton = e.destroy();
			b && this.redraw(o(this.options.chart.animation, a && a.animation, this.pointCount < 100))
		},
		pan: function(a) {
			var b = this.xAxis[0],
				c = this.mouseDownX,
				d = b.pointRange / 2,
				e = b.getExtremes(),
				f = b.translate(c - a, !0) + d,
				c = b.translate(c + this.plotWidth - a, !0) -
				d;
			(d = this.hoverPoints) && n(d, function(a) {
				a.setState()
			});
			b.series.length && f > K(e.dataMin, e.min) && c < q(e.dataMax, e.max) && b.setExtremes(f, c, !0, !1, {
				trigger: "pan"
			});
			this.mouseDownX = a;
			L(this.container, {
				cursor: "move"
			})
		},
		setTitle: function(a, b) {
			var f;
			var c = this,
				d = c.options,
				e;
			e = d.title = x(d.title, a);
			f = d.subtitle = x(d.subtitle, b), d = f;
			n([
				["title", a, e],
				["subtitle", b, d]
			], function(a) {
				var b = a[0],
					d = c[b],
					e = a[1],
					a = a[2];
				d && e && (c[b] = d = d.destroy());
				a && a.text && !d && (c[b] = c.renderer.text(a.text, 0, 0, a.useHTML).attr({
					align: a.align,
					"class": "highcharts-" + b,
					zIndex: a.zIndex || 4
				}).css(a.style).add().align(a, !1, "spacingBox"))
			})
		},
		getChartSize: function() {
			var a = this.options.chart,
				b = this.renderToClone || this.renderTo;
			this.containerWidth = gb(b, "width");
			this.containerHeight = gb(b, "height");
			this.chartWidth = q(0, a.width || this.containerWidth || 600);
			this.chartHeight = q(0, o(a.height, this.containerHeight > 19 ? this.containerHeight : 400))
		},
		cloneRenderTo: function(a) {
			var b = this.renderToClone,
				c = this.container;
			a ? b && (this.renderTo.appendChild(c), Ra(b), delete this.renderToClone) :
				(c && this.renderTo.removeChild(c), this.renderToClone = b = this.renderTo.cloneNode(0), L(b, {
					position: "absolute",
					top: "-9999px",
					display: "block"
				}), z.body.appendChild(b), c && b.appendChild(c))
		},
		getContainer: function() {
			var a, b = this.options.chart,
				c, d, e;
			this.renderTo = a = b.renderTo;
			e = "highcharts-" + ub++;
			if (fa(a)) this.renderTo = a = z.getElementById(a);
			a || qa(13, !0);
			c = u(A(a, "data-highcharts-chart"));
			!isNaN(c) && Ba[c] && Ba[c].destroy();
			A(a, "data-highcharts-chart", this.index);
			a.innerHTML = "";
			a.offsetWidth || this.cloneRenderTo();
			this.getChartSize();
			c = this.chartWidth;
			d = this.chartHeight;
			this.container = a = U(ya, {
				className: "highcharts-container" + (b.className ? " " + b.className : ""),
				id: e
			}, v({
				position: "relative",
				overflow: "hidden",
				width: c + "px",
				height: d + "px",
				textAlign: "left",
				lineHeight: "normal",
				zIndex: 0,
				"-webkit-tap-highlight-color": "rgba(0,0,0,0)"
			}, b.style), this.renderToClone || a);
			this._cursor = a.style.cursor;
			this.renderer = b.forExport ? new Ca(a, c, d, !0) : new Sa(a, c, d);
			$ && this.renderer.create(this, a, c, d)
		},
		getMargins: function() {
			var a = this.options.chart,
				b = a.spacingTop,
				c = a.spacingRight,
				d = a.spacingBottom,
				a = a.spacingLeft,
				e, f = this.legend,
				g = this.optionsMarginTop,
				h = this.optionsMarginLeft,
				i = this.optionsMarginRight,
				j = this.optionsMarginBottom,
				k = this.options.title,
				m = this.options.subtitle,
				l = this.options.legend,
				p = o(l.margin, 10),
				s = l.x,
				t = l.y,
				B = l.align,
				w = l.verticalAlign;
			this.resetMargins();
			e = this.axisOffset;
			if ((this.title || this.subtitle) && !r(this.optionsMarginTop))
				if (m = q(this.title && !k.floating && !k.verticalAlign && k.y || 0, this.subtitle && !m.floating && !m.verticalAlign &&
					m.y || 0)) this.plotTop = q(this.plotTop, m + o(k.margin, 15) + b);
			if (f.display && !l.floating)
				if (B === "right") {
					if (!r(i)) this.marginRight = q(this.marginRight, f.legendWidth - s + p + c)
				} else if (B === "left") {
				if (!r(h)) this.plotLeft = q(this.plotLeft, f.legendWidth + s + p + a)
			} else if (w === "top") {
				if (!r(g)) this.plotTop = q(this.plotTop, f.legendHeight + t + p + b)
			} else if (w === "bottom" && !r(j)) this.marginBottom = q(this.marginBottom, f.legendHeight - t + p + d);
			this.extraBottomMargin && (this.marginBottom += this.extraBottomMargin);
			this.extraTopMargin && (this.plotTop +=
				this.extraTopMargin);
			this.hasCartesianSeries && n(this.axes, function(a) {
				a.getOffset()
			});
			r(h) || (this.plotLeft += e[3]);
			r(g) || (this.plotTop += e[0]);
			r(j) || (this.marginBottom += e[2]);
			r(i) || (this.marginRight += e[1]);
			this.setChartSize()
		},
		initReflow: function() {
			function a(a) {
				var g = c.width || gb(d, "width"),
					h = c.height || gb(d, "height"),
					a = a ? a.target : O;
				if (!b.hasUserSize && g && h && (a === O || a === z)) {
					if (g !== b.containerWidth || h !== b.containerHeight) clearTimeout(e), b.reflowTimeout = e = setTimeout(function() {
						if (b.container) b.setSize(g,
							h, !1), b.hasUserSize = null
					}, 100);
					b.containerWidth = g;
					b.containerHeight = h
				}
			}
			var b = this,
				c = b.options.chart,
				d = b.renderTo,
				e;
			J(O, "resize", a);
			J(b, "destroy", function() {
				ba(O, "resize", a)
			})
		},
		setSize: function(a, b, c) {
			var d = this,
				e, f, g;
			d.isResizing += 1;
			g = function() {
				d && D(d, "endResize", null, function() {
					d.isResizing -= 1
				})
			};
			Ia(c, d);
			d.oldChartHeight = d.chartHeight;
			d.oldChartWidth = d.chartWidth;
			if (r(a)) d.chartWidth = e = q(0, t(a)), d.hasUserSize = !!e;
			if (r(b)) d.chartHeight = f = q(0, t(b));
			L(d.container, {
				width: e + "px",
				height: f + "px"
			});
			d.setChartSize(!0);
			d.renderer.setSize(e, f, c);
			d.maxTicks = null;
			n(d.axes, function(a) {
				a.isDirty = !0;
				a.setScale()
			});
			n(d.series, function(a) {
				a.isDirty = !0
			});
			d.isDirtyLegend = !0;
			d.isDirtyBox = !0;
			d.getMargins();
			d.redraw(c);
			d.oldChartHeight = null;
			D(d, "resize");
			za === !1 ? g() : setTimeout(g, za && za.duration || 500)
		},
		setChartSize: function(a) {
			var b = this.inverted,
				c = this.renderer,
				d = this.chartWidth,
				e = this.chartHeight,
				f = this.options.chart,
				g = f.spacingTop,
				h = f.spacingRight,
				i = f.spacingBottom,
				j = f.spacingLeft,
				k = this.clipOffset,
				m, l, p, o;
			this.plotLeft = m =
				t(this.plotLeft);
			this.plotTop = l = t(this.plotTop);
			this.plotWidth = p = q(0, t(d - m - this.marginRight));
			this.plotHeight = o = q(0, t(e - l - this.marginBottom));
			this.plotSizeX = b ? o : p;
			this.plotSizeY = b ? p : o;
			this.plotBorderWidth = b = f.plotBorderWidth || 0;
			this.spacingBox = c.spacingBox = {
				x: j,
				y: g,
				width: d - j - h,
				height: e - g - i
			};
			this.plotBox = c.plotBox = {
				x: m,
				y: l,
				width: p,
				height: o
			};
			c = ja(q(b, k[3]) / 2);
			d = ja(q(b, k[0]) / 2);
			this.clipBox = {
				x: c,
				y: d,
				width: T(this.plotSizeX - q(b, k[1]) / 2 - c),
				height: T(this.plotSizeY - q(b, k[2]) / 2 - d)
			};
			a || n(this.axes, function(a) {
				a.setAxisSize();
				a.setAxisTranslation()
			})
		},
		resetMargins: function() {
			var a = this.options.chart,
				b = a.spacingRight,
				c = a.spacingBottom,
				d = a.spacingLeft;
			this.plotTop = o(this.optionsMarginTop, a.spacingTop);
			this.marginRight = o(this.optionsMarginRight, b);
			this.marginBottom = o(this.optionsMarginBottom, c);
			this.plotLeft = o(this.optionsMarginLeft, d);
			this.axisOffset = [0, 0, 0, 0];
			this.clipOffset = [0, 0, 0, 0]
		},
		drawChartBox: function() {
			var a = this.options.chart,
				b = this.renderer,
				c = this.chartWidth,
				d = this.chartHeight,
				e = this.chartBackground,
				f = this.plotBackground,
				g = this.plotBorder,
				h = this.plotBGImage,
				i = a.borderWidth || 0,
				j = a.backgroundColor,
				k = a.plotBackgroundColor,
				m = a.plotBackgroundImage,
				l = a.plotBorderWidth || 0,
				p, o = this.plotLeft,
				n = this.plotTop,
				t = this.plotWidth,
				q = this.plotHeight,
				r = this.plotBox,
				v = this.clipRect,
				u = this.clipBox;
			p = i + (a.shadow ? 8 : 0);
			if (i || j)
				if (e) e.animate(e.crisp(null, null, null, c - p, d - p));
				else {
					e = {
						fill: j || S
					};
					if (i) e.stroke = a.borderColor, e["stroke-width"] = i;
					this.chartBackground = b.rect(p / 2, p / 2, c - p, d - p, a.borderRadius, i).attr(e).add().shadow(a.shadow)
				}
			if (k) f ?
				f.animate(r) : this.plotBackground = b.rect(o, n, t, q, 0).attr({
					fill: k
				}).add().shadow(a.plotShadow);
			if (m) h ? h.animate(r) : this.plotBGImage = b.image(m, o, n, t, q).add();
			v ? v.animate({
				width: u.width,
				height: u.height
			}) : this.clipRect = b.clipRect(u);
			if (l) g ? g.animate(g.crisp(null, o, n, t, q)) : this.plotBorder = b.rect(o, n, t, q, 0, l).attr({
				stroke: a.plotBorderColor,
				"stroke-width": l,
				zIndex: 1
			}).add();
			this.isDirtyBox = !1
		},
		propFromSeries: function() {
			var a = this,
				b = a.options.chart,
				c, d = a.options.series,
				e, f;
			n(["inverted", "angular", "polar"],
				function(g) {
					c = aa[b.type || b.defaultSeriesType];
					f = a[g] || b[g] || c && c.prototype[g];
					for (e = d && d.length; !f && e--;)(c = aa[d[e].type]) && c.prototype[g] && (f = !0);
					a[g] = f
				})
		},
		render: function() {
			var a = this,
				b = a.axes,
				c = a.renderer,
				d = a.options,
				e = d.labels,
				f = d.credits,
				g;
			a.setTitle();
			a.legend = new sb(a, d.legend);
			n(b, function(a) {
				a.setScale()
			});
			a.getMargins();
			a.maxTicks = null;
			n(b, function(a) {
				a.setTickPositions(!0);
				a.setMaxTicks()
			});
			a.adjustTickAmounts();
			a.getMargins();
			a.drawChartBox();
			a.hasCartesianSeries && n(b, function(a) {
				a.render()
			});
			if (!a.seriesGroup) a.seriesGroup = c.g("series-group").attr({
				zIndex: 3
			}).add();
			n(a.series, function(a) {
				a.translate();
				a.setTooltipPoints();
				a.render()
			});
			e.items && n(e.items, function(b) {
				var d = v(e.style, b.style),
					f = u(d.left) + a.plotLeft,
					g = u(d.top) + a.plotTop + 12;
				delete d.left;
				delete d.top;
				c.text(b.html, f, g).attr({
					zIndex: 2
				}).css(d).add()
			});
			if (f.enabled && !a.credits) g = f.href, a.credits = c.text(f.text, 0, 0).on("click", function() {
				if (g) location.href = g
			}).attr({
				align: f.position.align,
				zIndex: 8
			}).css(f.style).add().align(f.position);
			a.hasRendered = !0
		},
		destroy: function() {
			var a = this,
				b = a.axes,
				c = a.series,
				d = a.container,
				e, f = d && d.parentNode;
			D(a, "destroy");
			Ba[a.index] = y;
			a.renderTo.removeAttribute("data-highcharts-chart");
			ba(a);
			for (e = b.length; e--;) b[e] = b[e].destroy();
			for (e = c.length; e--;) c[e] = c[e].destroy();
			n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","), function(b) {
				var c = a[b];
				c && c.destroy && (a[b] = c.destroy())
			});
			if (d) d.innerHTML = "", ba(d), f && Ra(d);
			for (e in a) delete a[e]
		},
		isReadyToRender: function() {
			var a = this;
			return !Z && O == O.top && z.readyState !== "complete" || $ && !O.canvg ? ($ ? Rb.push(function() {
				a.firstRender()
			}, a.options.global.canvasToolsURL) : z.attachEvent("onreadystatechange", function() {
				z.detachEvent("onreadystatechange", a.firstRender);
				z.readyState === "complete" && a.firstRender()
			}), !1) : !0
		},
		firstRender: function() {
			var a = this,
				b = a.options,
				c = a.callback;
			if (a.isReadyToRender()) a.getContainer(), D(a, "init"), a.resetMargins(),
				a.setChartSize(), a.propFromSeries(), a.getAxes(), n(b.series || [], function(b) {
					a.initSeries(b)
				}), D(a, "beforeRender"), a.pointer = new rb(a, b), a.render(), a.renderer.draw(), c && c.apply(a, [a]), n(a.callbacks, function(b) {
					b.apply(a, [a])
				}), a.cloneRenderTo(!0), D(a, "load")
		}
	};
	tb.prototype.callbacks = [];
	var Na = function() {};
	Na.prototype = {
		init: function(a, b, c) {
			this.series = a;
			this.applyOptions(b, c);
			this.pointAttr = {};
			if (a.options.colorByPoint && (b = a.options.colors || a.chart.options.colors, this.color = this.color || b[a.colorCounter++],
				a.colorCounter === b.length)) a.colorCounter = 0;
			a.chart.pointCount++;
			return this
		},
		applyOptions: function(a, b) {
			var c = this.series,
				d = c.pointValKey,
				a = Na.prototype.optionsToObject.call(this, a);
			v(this, a);
			this.options = this.options ? v(this.options, a) : a;
			if (d) this.y = this[d];
			if (this.x === y && c) this.x = b === y ? c.autoIncrement() : b;
			return this
		},
		optionsToObject: function(a) {
			var b, c = this.series,
				d = c.pointArrayMap || ["y"],
				e = d.length,
				f = 0,
				g = 0;
			if (typeof a === "number" || a === null) b = {
				y: a
			};
			else if (Da(a)) {
				b = {};
				if (a.length > e) {
					c = typeof a[0];
					if (c === "string") b.name = a[0];
					else if (c === "number") b.x = a[0];
					f++
				}
				for (; g < e;) b[d[g++]] = a[f++]
			} else if (typeof a === "object") {
				b = a;
				if (a.dataLabels) c._hasPointLabels = !0;
				if (a.marker) c._hasPointMarkers = !0
			}
			return b
		},
		destroy: function() {
			var a = this.series.chart,
				b = a.hoverPoints,
				c;
			a.pointCount--;
			if (b && (this.setState(), ga(b, this), !b.length)) a.hoverPoints = null;
			if (this === a.hoverPoint) this.onMouseOut();
			if (this.graphic || this.dataLabel) ba(this), this.destroyElements();
			this.legendItem && a.legend.destroyItem(this);
			for (c in this) this[c] =
				null
		},
		destroyElements: function() {
			for (var a = "graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","), b, c = 6; c--;) b = a[c], this[b] && (this[b] = this[b].destroy())
		},
		getLabelConfig: function() {
			return {
				x: this.category,
				y: this.y,
				key: this.name || this.category,
				series: this.series,
				point: this,
				percentage: this.percentage,
				total: this.total || this.stackTotal
			}
		},
		select: function(a, b) {
			var c = this,
				d = c.series,
				e = d.chart,
				a = o(a, !c.selected);
			c.firePointEvent(a ? "select" : "unselect", {
				accumulate: b
			}, function() {
				c.selected =
					c.options.selected = a;
				d.options.data[la(c, d.data)] = c.options;
				c.setState(a && "select");
				b || n(e.getSelectedPoints(), function(a) {
					if (a.selected && a !== c) a.selected = a.options.selected = !1, d.options.data[la(a, d.data)] = a.options, a.setState(""), a.firePointEvent("unselect")
				})
			})
		},
		onMouseOver: function(a) {
			var b = this.series,
				c = b.chart,
				d = c.tooltip,
				e = c.hoverPoint;
			if (e && e !== this) e.onMouseOut();
			this.firePointEvent("mouseOver");
			d && (!d.shared || b.noSharedTooltip) && d.refresh(this, a);
			this.setState("hover");
			c.hoverPoint = this
		},
		onMouseOut: function() {
			var a = this.series.chart,
				b = a.hoverPoints;
			if (!b || la(this, b) === -1) this.firePointEvent("mouseOut"), this.setState(), a.hoverPoint = null
		},
		tooltipFormatter: function(a) {
			var b = this.series,
				c = b.tooltipOptions,
				d = o(c.valueDecimals, ""),
				e = c.valuePrefix || "",
				f = c.valueSuffix || "";
			n(b.pointArrayMap || ["y"], function(b) {
				b = "{point." + b;
				if (e || f) a = a.replace(b + "}", e + b + "}" + f);
				a = a.replace(b + "}", b + ":,." + d + "f}")
			});
			return wa(a, {
				point: this,
				series: this.series
			})
		},
		update: function(a, b, c) {
			var d = this,
				e = d.series,
				f = d.graphic,
				g, h = e.data,
				i = e.chart,
				b = o(b, !0);
			d.firePointEvent("update", {
				options: a
			}, function() {
				d.applyOptions(a);
				V(a) && (e.getAttribs(), f && f.attr(d.pointAttr[e.state]));
				g = la(d, h);
				e.xData[g] = d.x;
				e.yData[g] = e.toYData ? e.toYData(d) : d.y;
				e.zData[g] = d.z;
				e.options.data[g] = d.options;
				e.isDirty = !0;
				e.isDirtyData = !0;
				b && i.redraw(c)
			})
		},
		remove: function(a, b) {
			var c = this,
				d = c.series,
				e = d.chart,
				f, g = d.data;
			Ia(b, e);
			a = o(a, !0);
			c.firePointEvent("remove", null, function() {
				f = la(c, g);
				g.splice(f, 1);
				d.options.data.splice(f, 1);
				d.xData.splice(f, 1);
				d.yData.splice(f, 1);
				d.zData.splice(f, 1);
				c.destroy();
				d.isDirty = !0;
				d.isDirtyData = !0;
				a && e.redraw()
			})
		},
		firePointEvent: function(a, b, c) {
			var d = this,
				e = this.series.options;
			(e.point.events[a] || d.options && d.options.events && d.options.events[a]) && this.importEvents();
			a === "click" && e.allowPointSelect && (c = function(a) {
				d.select(null, a.ctrlKey || a.metaKey || a.shiftKey)
			});
			D(this, a, b, c)
		},
		importEvents: function() {
			if (!this.hasImportedEvents) {
				var a = x(this.series.options.point, this.options).events,
					b;
				this.events = a;
				for (b in a) J(this,
					b, a[b]);
				this.hasImportedEvents = !0
			}
		},
		setState: function(a) {
			var b = this.plotX,
				c = this.plotY,
				d = this.series,
				e = d.options.states,
				f = X[d.type].marker && d.options.marker,
				g = f && !f.enabled,
				h = f && f.states[a],
				i = h && h.enabled === !1,
				j = d.stateMarkerGraphic,
				k = this.marker || {},
				m = d.chart,
				l = this.pointAttr,
				a = a || "";
			if (!(a === this.state || this.selected && a !== "select" || e[a] && e[a].enabled === !1 || a && (i || g && !h.enabled))) {
				if (this.graphic) e = f && this.graphic.symbolName && l[a].r, this.graphic.attr(x(l[a], e ? {
					x: b - e,
					y: c - e,
					width: 2 * e,
					height: 2 * e
				} : {}));
				else {
					if (a && h) e = h.radius, k = k.symbol || d.symbol, j && j.currentSymbol !== k && (j = j.destroy()), j ? j.attr({
						x: b - e,
						y: c - e
					}) : (d.stateMarkerGraphic = j = m.renderer.symbol(k, b - e, c - e, 2 * e, 2 * e).attr(l[a]).add(d.markerGroup), j.currentSymbol = k);
					if (j) j[a && m.isInsidePlot(b, c) ? "show" : "hide"]()
				}
				this.state = a
			}
		}
	};
	var R = function() {};
	R.prototype = {
		isCartesian: !0,
		type: "line",
		pointClass: Na,
		sorted: !0,
		requireSorting: !0,
		pointAttrToOptions: {
			stroke: "lineColor",
			"stroke-width": "lineWidth",
			fill: "fillColor",
			r: "radius"
		},
		colorCounter: 0,
		init: function(a,
			b) {
			var c, d, e = a.series;
			this.chart = a;
			this.options = b = this.setOptions(b);
			this.bindAxes();
			v(this, {
				name: b.name,
				state: "",
				pointAttr: {},
				visible: b.visible !== !1,
				selected: b.selected === !0
			});
			if ($) b.animation = !1;
			d = b.events;
			for (c in d) J(this, c, d[c]);
			if (d && d.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0;
			this.getColor();
			this.getSymbol();
			this.setData(b.data, !1);
			if (this.isCartesian) a.hasCartesianSeries = !0;
			e.push(this);
			this._i = e.length - 1;
			Ib(e, function(a, b) {
				return o(a.options.index,
					a._i) - o(b.options.index, a._i)
			});
			n(e, function(a, b) {
				a.index = b;
				a.name = a.name || "Series " + (b + 1)
			});
			c = b.linkedTo;
			this.linkedSeries = [];
			if (fa(c) && (c = c === ":previous" ? e[this.index - 1] : a.get(c))) c.linkedSeries.push(this), this.linkedParent = c
		},
		bindAxes: function() {
			var a = this,
				b = a.options,
				c = a.chart,
				d;
			a.isCartesian && n(["xAxis", "yAxis"], function(e) {
				n(c[e], function(c) {
					d = c.options;
					if (b[e] === d.index || b[e] !== y && b[e] === d.id || b[e] === y && d.index === 0) c.series.push(a), a[e] = c, c.isDirty = !0
				});
				a[e] || qa(18, !0)
			})
		},
		autoIncrement: function() {
			var a =
				this.options,
				b = this.xIncrement,
				b = o(b, a.pointStart, 0);
			this.pointInterval = o(this.pointInterval, a.pointInterval, 1);
			this.xIncrement = b + this.pointInterval;
			return b
		},
		getSegments: function() {
			var a = -1,
				b = [],
				c, d = this.points,
				e = d.length;
			if (e)
				if (this.options.connectNulls) {
					for (c = e; c--;) d[c].y === null && d.splice(c, 1);
					d.length && (b = [d])
				} else n(d, function(c, g) {
					c.y === null ? (g > a + 1 && b.push(d.slice(a + 1, g)), a = g) : g === e - 1 && b.push(d.slice(a + 1, g + 1))
				});
			this.segments = b
		},
		setOptions: function(a) {
			var b = this.chart.options,
				c = b.plotOptions,
				d = c[this.type];
			this.userOptions = a;
			a = x(d, c.series, a);
			this.tooltipOptions = x(b.tooltip, a.tooltip);
			d.marker === null && delete a.marker;
			return a
		},
		getColor: function() {
			var a = this.options,
				b = this.userOptions,
				c = this.chart.options.colors,
				d = this.chart.counters,
				e;
			e = a.color || X[this.type].color;
			if (!e && !a.colorByPoint) r(b._colorIndex) ? a = b._colorIndex : (b._colorIndex = d.color, a = d.color++), e = c[a];
			this.color = e;
			d.wrapColor(c.length)
		},
		getSymbol: function() {
			var a = this.userOptions,
				b = this.options.marker,
				c = this.chart,
				d = c.options.symbols,
				c = c.counters;
			this.symbol = b.symbol;
			if (!this.symbol) r(a._symbolIndex) ? a = a._symbolIndex : (a._symbolIndex = c.symbol, a = c.symbol++), this.symbol = d[a];
			if (/^url/.test(this.symbol)) b.radius = 0;
			c.wrapSymbol(d.length)
		},
		drawLegendSymbol: function(a) {
			var b = this.options,
				c = b.marker,
				d = a.options.symbolWidth,
				e = this.chart.renderer,
				f = this.legendGroup,
				a = a.baseline,
				g;
			if (b.lineWidth) {
				g = {
					"stroke-width": b.lineWidth
				};
				if (b.dashStyle) g.dashstyle = b.dashStyle;
				this.legendLine = e.path(["M", 0, a - 4, "L", d, a - 4]).attr(g).add(f)
			}
			if (c && c.enabled) b =
				c.radius, this.legendSymbol = e.symbol(this.symbol, d / 2 - b, a - 4 - b, 2 * b, 2 * b).add(f)
		},
		addPoint: function(a, b, c, d) {
			var e = this.options,
				f = this.data,
				g = this.graph,
				h = this.area,
				i = this.chart,
				j = this.xData,
				k = this.yData,
				m = this.zData,
				l = this.names,
				p = g && g.shift || 0,
				n = e.data;
			Ia(d, i);
			if (g && c) g.shift = p + 1;
			if (h) {
				if (c) h.shift = p + 1;
				h.isArea = !0
			}
			b = o(b, !0);
			d = {
				series: this
			};
			this.pointClass.prototype.applyOptions.apply(d, [a]);
			j.push(d.x);
			k.push(this.toYData ? this.toYData(d) : d.y);
			m.push(d.z);
			if (l) l[d.x] = d.name;
			n.push(a);
			e.legendType === "point" &&
				this.generatePoints();
			c && (f[0] && f[0].remove ? f[0].remove(!1) : (f.shift(), j.shift(), k.shift(), m.shift(), n.shift()));
			this.getAttribs();
			this.isDirtyData = this.isDirty = !0;
			b && i.redraw()
		},
		setData: function(a, b) {
			var c = this.points,
				d = this.options,
				e = this.chart,
				f = null,
				g = this.xAxis,
				h = g && g.categories && !g.categories.length ? [] : null,
				i;
			this.xIncrement = null;
			this.pointRange = g && g.categories ? 1 : d.pointRange;
			this.colorCounter = 0;
			var j = [],
				k = [],
				m = [],
				l = a ? a.length : [],
				p = (i = this.pointArrayMap) && i.length,
				n = !!this.toYData;
			if (l > (d.turboThreshold ||
				1E3)) {
				for (i = 0; f === null && i < l;) f = a[i], i++;
				if (Ea(f)) {
					f = o(d.pointStart, 0);
					d = o(d.pointInterval, 1);
					for (i = 0; i < l; i++) j[i] = f, k[i] = a[i], f += d;
					this.xIncrement = f
				} else if (Da(f))
					if (p)
						for (i = 0; i < l; i++) d = a[i], j[i] = d[0], k[i] = d.slice(1, p + 1);
					else
						for (i = 0; i < l; i++) d = a[i], j[i] = d[0], k[i] = d[1]
			} else
				for (i = 0; i < l; i++)
					if (a[i] !== y && (d = {
						series: this
					}, this.pointClass.prototype.applyOptions.apply(d, [a[i]]), j[i] = d.x, k[i] = n ? this.toYData(d) : d.y, m[i] = d.z, h && d.name)) h[i] = d.name;
			this.requireSorting && j.length > 1 && j[1] < j[0] && qa(15);
			fa(k[0]) &&
				qa(14, !0);
			this.data = [];
			this.options.data = a;
			this.xData = j;
			this.yData = k;
			this.zData = m;
			this.names = h;
			for (i = c && c.length || 0; i--;) c[i] && c[i].destroy && c[i].destroy();
			if (g) g.minRange = g.userMinRange;
			this.isDirty = this.isDirtyData = e.isDirtyBox = !0;
			o(b, !0) && e.redraw(!1)
		},
		remove: function(a, b) {
			var c = this,
				d = c.chart,
				a = o(a, !0);
			if (!c.isRemoving) c.isRemoving = !0, D(c, "remove", null, function() {
				c.destroy();
				d.isDirtyLegend = d.isDirtyBox = !0;
				a && d.redraw(b)
			});
			c.isRemoving = !1
		},
		processData: function(a) {
			var b = this.xData,
				c = this.yData,
				d = b.length,
				e = 0,
				f = d,
				g, h, i = this.xAxis,
				j = this.options,
				k = j.cropThreshold,
				m = this.isCartesian;
			if (m && !this.isDirty && !i.isDirty && !this.yAxis.isDirty && !a) return !1;
			if (m && this.sorted && (!k || d > k || this.forceCrop))
				if (a = i.getExtremes(), i = a.min, k = a.max, b[d - 1] < i || b[0] > k) b = [], c = [];
				else if (b[0] < i || b[d - 1] > k) {
				for (a = 0; a < d; a++)
					if (b[a] >= i) {
						e = q(0, a - 1);
						break
					}
				for (; a < d; a++)
					if (b[a] > k) {
						f = a + 1;
						break
					}
				b = b.slice(e, f);
				c = c.slice(e, f);
				g = !0
			}
			for (a = b.length - 1; a > 0; a--)
				if (d = b[a] - b[a - 1], d > 0 && (h === y || d < h)) h = d;
			this.cropped = g;
			this.cropStart = e;
			this.processedXData = b;
			this.processedYData = c;
			if (j.pointRange === null) this.pointRange = h || 1;
			this.closestPointRange = h
		},
		generatePoints: function() {
			var a = this.options.data,
				b = this.data,
				c, d = this.processedXData,
				e = this.processedYData,
				f = this.pointClass,
				g = d.length,
				h = this.cropStart || 0,
				i, j = this.hasGroupedData,
				k, m = [],
				l;
			if (!b && !j) b = [], b.length = a.length, b = this.data = b;
			for (l = 0; l < g; l++) i = h + l, j ? m[l] = (new f).init(this, [d[l]].concat(ha(e[l]))) : (b[i] ? k = b[i] : a[i] !== y && (b[i] = k = (new f).init(this, a[i], d[l])), m[l] = k);
			if (b && (g !==
				(c = b.length) || j))
				for (l = 0; l < c; l++)
					if (l === h && !j && (l += g), b[l]) b[l].destroyElements(), b[l].plotX = y;
			this.data = b;
			this.points = m
		},
		translate: function() {
			this.processedXData || this.processData();
			this.generatePoints();
			var a = this.options,
				b = a.stacking,
				c = this.xAxis,
				d = c.categories,
				e = this.yAxis,
				f = this.points,
				g = f.length,
				h = !!this.modifyValue,
				i, j, k = a.pointPlacement === "between",
				m = a.threshold;
			j = e.series.sort(function(a, b) {
				return a.index - b.index
			});
			for (a = j.length; a--;)
				if (j[a].visible) {
					j[a] === this && (i = !0);
					break
				}
			for (a = 0; a <
				g; a++) {
				j = f[a];
				var l = j.x,
					p = j.y,
					n = j.low,
					q = e.stacks[(p < m ? "-" : "") + this.stackKey];
				if (e.isLog && p <= 0) j.y = p = null;
				j.plotX = c.translate(l, 0, 0, 0, 1, k);
				if (b && this.visible && q && q[l]) n = q[l], q = n.total, n.cum = n = n.cum - p, p = n + p, i && (n = o(m, e.min)), e.isLog && n <= 0 && (n = null), b === "percent" && (n = q ? n * 100 / q : 0, p = q ? p * 100 / q : 0), j.percentage = q ? j.y * 100 / q : 0, j.total = j.stackTotal = q, j.stackY = p;
				j.yBottom = r(n) ? e.translate(n, 0, 1, 0, 1) : null;
				h && (p = this.modifyValue(p, j));
				j.plotY = typeof p === "number" && p !== Infinity ? t(e.translate(p, 0, 1, 0, 1) * 10) / 10 : y;
				j.clientX = k ? c.translate(l, 0, 0, 0, 1) : j.plotX;
				j.negative = j.y < (m || 0);
				j.category = d && d[j.x] !== y ? d[j.x] : j.x
			}
			this.getSegments()
		},
		setTooltipPoints: function(a) {
			var b = [],
				c, d, e = (c = this.xAxis) ? c.tooltipLen || c.len : this.chart.plotSizeX,
				f, g, h = [];
			if (this.options.enableMouseTracking !== !1) {
				if (a) this.tooltipPoints = null;
				n(this.segments || this.points, function(a) {
					b = b.concat(a)
				});
				c && c.reversed && (b = b.reverse());
				a = b.length;
				for (g = 0; g < a; g++) {
					f = b[g];
					c = b[g - 1] ? d + 1 : 0;
					for (d = b[g + 1] ? q(0, T((f.clientX + (b[g + 1] ? b[g + 1].clientX : e)) / 2)) : e; c >=
						0 && c <= d;) h[c++] = f
				}
				this.tooltipPoints = h
			}
		},
		tooltipHeaderFormatter: function(a) {
			var b = this.tooltipOptions,
				c = b.xDateFormat,
				d = b.dateTimeLabelFormats,
				e = this.xAxis,
				f = e && e.options.type === "datetime",
				b = b.headerFormat,
				e = e && e.closestPointRange,
				g;
			if (f && !c)
				if (e)
					for (g in E) {
						if (E[g] >= e) {
							c = d[g];
							break
						}
					} else c = d.day;
			f && c && Ea(a.key) && (b = b.replace("{point.key}", "{point.key:" + c + "}"));
			return wa(b, {
				point: a,
				series: this
			})
		},
		onMouseOver: function() {
			var a = this.chart,
				b = a.hoverSeries;
			if (b && b !== this) b.onMouseOut();
			this.options.events.mouseOver &&
				D(this, "mouseOver");
			this.setState("hover");
			a.hoverSeries = this
		},
		onMouseOut: function() {
			var a = this.options,
				b = this.chart,
				c = b.tooltip,
				d = b.hoverPoint;
			if (d) d.onMouseOut();
			this && a.events.mouseOut && D(this, "mouseOut");
			c && !a.stickyTracking && (!c.shared || this.noSharedTooltip) && c.hide();
			this.setState();
			b.hoverSeries = null
		},
		animate: function(a) {
			var b = this,
				c = b.chart,
				d = c.renderer,
				e;
			e = b.options.animation;
			var f = c.clipBox,
				g = c.inverted,
				h;
			if (e && !V(e)) e = X[b.type].animation;
			h = "_sharedClip" + e.duration + e.easing;
			if (a) a = c[h],
				e = c[h + "m"], a || (c[h] = a = d.clipRect(v(f, {
					width: 0
				})), c[h + "m"] = e = d.clipRect(-99, g ? -c.plotLeft : -c.plotTop, 99, g ? c.chartWidth : c.chartHeight)), b.group.clip(a), b.markerGroup.clip(e), b.sharedClipKey = h;
			else {
				if (a = c[h]) a.animate({
					width: c.plotSizeX
				}, e), c[h + "m"].animate({
					width: c.plotSizeX + 99
				}, e);
				b.animate = null;
				b.animationTimeout = setTimeout(function() {
					b.afterAnimate()
				}, e.duration)
			}
		},
		afterAnimate: function() {
			var a = this.chart,
				b = this.sharedClipKey,
				c = this.group;
			c && this.options.clip !== !1 && (c.clip(a.clipRect), this.markerGroup.clip());
			setTimeout(function() {
				b && a[b] && (a[b] = a[b].destroy(), a[b + "m"] = a[b + "m"].destroy())
			}, 100)
		},
		drawPoints: function() {
			var a, b = this.points,
				c = this.chart,
				d, e, f, g, h, i, j, k, m = this.options.marker,
				l, n = this.markerGroup;
			if (m.enabled || this._hasPointMarkers)
				for (f = b.length; f--;)
					if (g = b[f], d = g.plotX, e = g.plotY, k = g.graphic, i = g.marker || {}, a = m.enabled && i.enabled === y || i.enabled, l = c.isInsidePlot(t(d), e, c.inverted), a && e !== y && !isNaN(e) && g.y !== null)
						if (a = g.pointAttr[g.selected ? "select" : ""], h = a.r, i = o(i.symbol, this.symbol), j = i.indexOf("url") ===
							0, k) k.attr({
							visibility: l ? Z ? "inherit" : "visible" : "hidden"
						}).animate(v({
							x: d - h,
							y: e - h
						}, k.symbolName ? {
							width: 2 * h,
							height: 2 * h
						} : {}));
						else {
							if (l && (h > 0 || j)) g.graphic = c.renderer.symbol(i, d - h, e - h, 2 * h, 2 * h).attr(a).add(n)
						} else if (k) g.graphic = k.destroy()
		},
		convertAttribs: function(a, b, c, d) {
			var e = this.pointAttrToOptions,
				f, g, h = {},
				a = a || {},
				b = b || {},
				c = c || {},
				d = d || {};
			for (f in e) g = e[f], h[f] = o(a[g], b[f], c[f], d[f]);
			return h
		},
		getAttribs: function() {
			var a = this,
				b = a.options,
				c = X[a.type].marker ? b.marker : b,
				d = c.states,
				e = d.hover,
				f, g = a.color,
				h = {
					stroke: g,
					fill: g
				},
				i = a.points || [],
				j = [],
				k, m = a.pointAttrToOptions,
				l = b.negativeColor,
				p;
			b.marker ? (e.radius = e.radius || c.radius + 2, e.lineWidth = e.lineWidth || c.lineWidth + 1) : e.color = e.color || ma(e.color || g).brighten(e.brightness).get();
			j[""] = a.convertAttribs(c, h);
			n(["hover", "select"], function(b) {
				j[b] = a.convertAttribs(d[b], j[""])
			});
			a.pointAttr = j;
			for (g = i.length; g--;) {
				h = i[g];
				if ((c = h.options && h.options.marker || h.options) && c.enabled === !1) c.radius = 0;
				if (h.negative && l) h.color = h.fillColor = l;
				f = b.colorByPoint || h.color;
				if (h.options)
					for (p in m) r(c[m[p]]) && (f = !0);
				if (f) {
					c = c || {};
					k = [];
					d = c.states || {};
					f = d.hover = d.hover || {};
					if (!b.marker) f.color = ma(f.color || h.color).brighten(f.brightness || e.brightness).get();
					k[""] = a.convertAttribs(v({
						color: h.color
					}, c), j[""]);
					k.hover = a.convertAttribs(d.hover, j.hover, k[""]);
					k.select = a.convertAttribs(d.select, j.select, k[""]);
					if (h.negative && b.marker && l) k[""].fill = k.hover.fill = k.select.fill = a.convertAttribs({
						fillColor: l
					}).fill
				} else k = j;
				h.pointAttr = k
			}
		},
		update: function(a, b) {
			var c = this.chart,
				d =
				this.type,
				a = x(this.userOptions, {
					animation: !1,
					index: this.index,
					pointStart: this.xData[0]
				}, a);
			this.remove(!1);
			v(this, aa[a.type || d].prototype);
			this.init(c, a);
			o(b, !0) && c.redraw(!1)
		},
		destroy: function() {
			var a = this,
				b = a.chart,
				c = /AppleWebKit\/533/.test(Aa),
				d, e, f = a.data || [],
				g, h, i;
			D(a, "destroy");
			ba(a);
			n(["xAxis", "yAxis"], function(b) {
				if (i = a[b]) ga(i.series, a), i.isDirty = i.forceRedraw = !0
			});
			a.legendItem && a.chart.legend.destroyItem(a);
			for (e = f.length; e--;)(g = f[e]) && g.destroy && g.destroy();
			a.points = null;
			clearTimeout(a.animationTimeout);
			n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","), function(b) {
				a[b] && (d = c && b === "group" ? "hide" : "destroy", a[b][d]())
			});
			if (b.hoverSeries === a) b.hoverSeries = null;
			ga(b.series, a);
			for (h in a) delete a[h]
		},
		drawDataLabels: function() {
			var a = this,
				b = a.options.dataLabels,
				c = a.points,
				d, e, f, g;
			if (b.enabled || a._hasPointLabels) a.dlProcessOptions && a.dlProcessOptions(b), g = a.plotGroup("dataLabelsGroup", "data-labels", a.visible ? "visible" : "hidden", b.zIndex || 6), e = b, n(c, function(c) {
				var i,
					j = c.dataLabel,
					k, m, l = c.connector,
					n = !0;
				d = c.options && c.options.dataLabels;
				i = e.enabled || d && d.enabled;
				if (j && !i) c.dataLabel = j.destroy();
				else if (i) {
					i = b.rotation;
					b = x(e, d);
					k = c.getLabelConfig();
					f = b.format ? wa(b.format, k) : b.formatter.call(k, b);
					b.style.color = o(b.color, b.style.color, a.color, "black");
					if (j)
						if (r(f)) j.attr({
							text: f
						}), n = !1;
						else {
							if (c.dataLabel = j = j.destroy(), l) c.connector = l.destroy()
						} else if (r(f)) {
						j = {
							fill: b.backgroundColor,
							stroke: b.borderColor,
							"stroke-width": b.borderWidth,
							r: b.borderRadius || 0,
							rotation: i,
							padding: b.padding,
							zIndex: 1
						};
						for (m in j) j[m] === y && delete j[m];
						j = c.dataLabel = a.chart.renderer[i ? "text" : "label"](f, 0, -999, null, null, null, b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)
					}
					j && a.alignDataLabel(c, j, b, null, n)
				}
			})
		},
		alignDataLabel: function(a, b, c, d, e) {
			var f = this.chart,
				g = f.inverted,
				h = o(a.plotX, -999),
				a = o(a.plotY, -999),
				i = b.getBBox(),
				d = v({
					x: g ? f.plotWidth - a : h,
					y: t(g ? f.plotHeight - h : a),
					width: 0,
					height: 0
				}, d);
			v(c, {
				width: i.width,
				height: i.height
			});
			c.rotation ? (d = {
				align: c.align,
				x: d.x + c.x + d.width / 2,
				y: d.y +
					c.y + d.height / 2
			}, b[e ? "attr" : "animate"](d)) : b.align(c, null, d);
			b.attr({
				visibility: c.crop === !1 || f.isInsidePlot(h, a, g) ? f.renderer.isSVG ? "inherit" : "visible" : "hidden"
			})
		},
		getSegmentPath: function(a) {
			var b = this,
				c = [],
				d = b.options.step;
			n(a, function(e, f) {
				var g = e.plotX,
					h = e.plotY,
					i;
				b.getPointSpline ? c.push.apply(c, b.getPointSpline(a, e, f)) : (c.push(f ? "L" : "M"), d && f && (i = a[f - 1], d === "right" ? c.push(i.plotX, h) : d === "center" ? c.push((i.plotX + g) / 2, i.plotY, (i.plotX + g) / 2, h) : c.push(g, i.plotY)), c.push(e.plotX, e.plotY))
			});
			return c
		},
		getGraphPath: function() {
			var a = this,
				b = [],
				c, d = [];
			n(a.segments, function(e) {
				c = a.getSegmentPath(e);
				e.length > 1 ? b = b.concat(c) : d.push(e[0])
			});
			a.singlePoints = d;
			return a.graphPath = b
		},
		drawGraph: function() {
			var a = this,
				b = this.options,
				c = [
					["graph", b.lineColor || this.color]
				],
				d = b.lineWidth,
				e = b.dashStyle,
				f = this.getGraphPath(),
				g = b.negativeColor;
			g && c.push(["graphNeg", g]);
			n(c, function(c, g) {
				var j = c[0],
					k = a[j];
				if (k) Ta(k), k.animate({
					d: f
				});
				else if (d && f.length) {
					k = {
						stroke: c[1],
						"stroke-width": d,
						zIndex: 1
					};
					if (e) k.dashstyle = e;
					a[j] =
						a.chart.renderer.path(f).attr(k).add(a.group).shadow(!g && b.shadow)
				}
			})
		},
		clipNeg: function() {
			var a = this.options,
				b = this.chart,
				c = b.renderer,
				d = a.negativeColor,
				e, f = this.graph,
				g = this.area,
				h = this.posClip,
				i = this.negClip;
			e = b.chartWidth;
			var j = b.chartHeight,
				k = q(e, j);
			if (d && (f || g)) d = ja(this.yAxis.len - this.yAxis.translate(a.threshold || 0)), a = {
				x: 0,
				y: 0,
				width: k,
				height: d
			}, k = {
				x: 0,
				y: d,
				width: k,
				height: k - d
			}, b.inverted && c.isVML && (a = {
				x: b.plotWidth - d - b.plotLeft,
				y: 0,
				width: e,
				height: j
			}, k = {
				x: d + b.plotLeft - e,
				y: 0,
				width: b.plotLeft + d,
				height: e
			}), this.yAxis.reversed ? (b = k, e = a) : (b = a, e = k), h ? (h.animate(b), i.animate(e)) : (this.posClip = h = c.clipRect(b), this.negClip = i = c.clipRect(e), f && (f.clip(h), this.graphNeg.clip(i)), g && (g.clip(h), this.areaNeg.clip(i)))
		},
		invertGroups: function() {
			function a() {
				var a = {
					width: b.yAxis.len,
					height: b.xAxis.len
				};
				n(["group", "markerGroup"], function(c) {
					b[c] && b[c].attr(a).invert()
				})
			}
			var b = this,
				c = b.chart;
			if (b.xAxis) J(c, "resize", a), J(b, "destroy", function() {
				ba(c, "resize", a)
			}), a(), b.invertGroups = a
		},
		plotGroup: function(a, b,
			c, d, e) {
			var f = this[a],
				g = !f,
				h = this.chart,
				i = this.xAxis,
				j = this.yAxis;
			g && (this[a] = f = h.renderer.g(b).attr({
				visibility: c,
				zIndex: d || 0.1
			}).add(e));
			f[g ? "attr" : "animate"]({
				translateX: i ? i.left : h.plotLeft,
				translateY: j ? j.top : h.plotTop,
				scaleX: 1,
				scaleY: 1
			});
			return f
		},
		render: function() {
			var a = this.chart,
				b, c = this.options,
				d = c.animation && !!this.animate && a.renderer.isSVG,
				e = this.visible ? "visible" : "hidden",
				f = c.zIndex,
				g = this.hasRendered,
				h = a.seriesGroup;
			b = this.plotGroup("group", "series", e, f, h);
			this.markerGroup = this.plotGroup("markerGroup",
				"markers", e, f, h);
			d && this.animate(!0);
			this.getAttribs();
			b.inverted = this.isCartesian ? a.inverted : !1;
			this.drawGraph && (this.drawGraph(), this.clipNeg());
			this.drawDataLabels();
			this.drawPoints();
			this.options.enableMouseTracking !== !1 && this.drawTracker();
			a.inverted && this.invertGroups();
			c.clip !== !1 && !this.sharedClipKey && !g && b.clip(a.clipRect);
			d ? this.animate() : g || this.afterAnimate();
			this.isDirty = this.isDirtyData = !1;
			this.hasRendered = !0
		},
		redraw: function() {
			var a = this.chart,
				b = this.isDirtyData,
				c = this.group,
				d = this.xAxis,
				e = this.yAxis;
			c && (a.inverted && c.attr({
				width: a.plotWidth,
				height: a.plotHeight
			}), c.animate({
				translateX: o(d && d.left, a.plotLeft),
				translateY: o(e && e.top, a.plotTop)
			}));
			this.translate();
			this.setTooltipPoints(!0);
			this.render();
			b && D(this, "updatedData")
		},
		setState: function(a) {
			var b = this.options,
				c = this.graph,
				d = this.graphNeg,
				e = b.states,
				b = b.lineWidth,
				a = a || "";
			if (this.state !== a) this.state = a, e[a] && e[a].enabled === !1 || (a && (b = e[a].lineWidth || b + 1), c && !c.dashstyle && (a = {
				"stroke-width": b
			}, c.attr(a), d && d.attr(a)))
		},
		setVisible: function(a,
			b) {
			var c = this,
				d = c.chart,
				e = c.legendItem,
				f, g = d.options.chart.ignoreHiddenSeries,
				h = c.visible;
			f = (c.visible = a = c.userOptions.visible = a === y ? !h : a) ? "show" : "hide";
			n(["group", "dataLabelsGroup", "markerGroup", "tracker"], function(a) {
				if (c[a]) c[a][f]()
			});
			if (d.hoverSeries === c) c.onMouseOut();
			e && d.legend.colorizeItem(c, a);
			c.isDirty = !0;
			c.options.stacking && n(d.series, function(a) {
				if (a.options.stacking && a.visible) a.isDirty = !0
			});
			n(c.linkedSeries, function(b) {
				b.setVisible(a, !1)
			});
			if (g) d.isDirtyBox = !0;
			b !== !1 && d.redraw();
			D(c,
				f)
		},
		show: function() {
			this.setVisible(!0)
		},
		hide: function() {
			this.setVisible(!1)
		},
		select: function(a) {
			this.selected = a = a === y ? !this.selected : a;
			if (this.checkbox) this.checkbox.checked = a;
			D(this, a ? "select" : "unselect")
		},
		drawTracker: function() {
			var a = this,
				b = a.options,
				c = b.trackByArea,
				d = [].concat(c ? a.areaPath : a.graphPath),
				e = d.length,
				f = a.chart,
				g = f.pointer,
				h = f.renderer,
				i = f.options.tooltip.snap,
				j = a.tracker,
				k = b.cursor,
				k = k && {
					cursor: k
				},
				m = a.singlePoints,
				l, n = function() {
					if (f.hoverSeries !== a) a.onMouseOver()
				};
			if (e && !c)
				for (l =
					e + 1; l--;) d[l] === "M" && d.splice(l + 1, 0, d[l + 1] - i, d[l + 2], "L"), (l && d[l] === "M" || l === e) && d.splice(l, 0, "L", d[l - 2] + i, d[l - 1]);
			for (l = 0; l < m.length; l++) e = m[l], d.push("M", e.plotX - i, e.plotY, "L", e.plotX + i, e.plotY);
			if (j) j.attr({
				d: d
			});
			else if (a.tracker = j = h.path(d).attr({
					"class": "highcharts-tracker",
					"stroke-linejoin": "round",
					visibility: a.visible ? "visible" : "hidden",
					stroke: Ob,
					fill: c ? Ob : S,
					"stroke-width": b.lineWidth + (c ? 0 : 2 * i),
					zIndex: 2
				}).addClass("highcharts-tracker").on("mouseover", n).on("mouseout", function(a) {
					g.onTrackerMouseOut(a)
				}).css(k).add(a.markerGroup),
				fb) j.on("touchstart", n)
		}
	};
	M = ea(R);
	aa.line = M;
	X.area = x(W, {
		threshold: 0
	});
	M = ea(R, {
		type: "area",
		getSegments: function() {
			var a = [],
				b = [],
				c = [],
				d = this.xAxis,
				e = this.yAxis,
				f = e.stacks[this.stackKey],
				g = {},
				h, i, j = this.points,
				k, m;
			if (this.options.stacking && !this.cropped) {
				for (k = 0; k < j.length; k++) g[j[k].x] = j[k];
				for (m in f) c.push(+m);
				c.sort(function(a, b) {
					return a - b
				});
				n(c, function(a) {
					g[a] ? b.push(g[a]) : (h = d.translate(a), i = e.toPixels(f[a].cum, !0), b.push({
						y: null,
						plotX: h,
						clientX: h,
						plotY: i,
						yBottom: i,
						onMouseOver: ta
					}))
				});
				b.length &&
					a.push(b)
			} else R.prototype.getSegments.call(this), a = this.segments;
			this.segments = a
		},
		getSegmentPath: function(a) {
			var b = R.prototype.getSegmentPath.call(this, a),
				c = [].concat(b),
				d, e = this.options;
			b.length === 3 && c.push("L", b[1], b[2]);
			if (e.stacking && !this.closedStacks)
				for (d = a.length - 1; d >= 0; d--) d < a.length - 1 && e.step && c.push(a[d + 1].plotX, a[d].yBottom), c.push(a[d].plotX, a[d].yBottom);
			else this.closeSegment(c, a);
			this.areaPath = this.areaPath.concat(c);
			return b
		},
		closeSegment: function(a, b) {
			var c = this.yAxis.getThreshold(this.options.threshold);
			a.push("L", b[b.length - 1].plotX, c, "L", b[0].plotX, c)
		},
		drawGraph: function() {
			this.areaPath = [];
			R.prototype.drawGraph.apply(this);
			var a = this,
				b = this.areaPath,
				c = this.options,
				d = [
					["area", this.color, c.fillColor]
				];
			c.negativeColor && d.push(["areaNeg", c.negativeColor, c.negativeFillColor]);
			n(d, function(d) {
				var f = d[0],
					g = a[f];
				g ? g.animate({
					d: b
				}) : a[f] = a.chart.renderer.path(b).attr({
					fill: o(d[2], ma(d[1]).setOpacity(c.fillOpacity || 0.75).get()),
					zIndex: 0
				}).add(a.group)
			})
		},
		drawLegendSymbol: function(a, b) {
			b.legendSymbol = this.chart.renderer.rect(0,
				a.baseline - 11, a.options.symbolWidth, 12, 2).attr({
				zIndex: 3
			}).add(b.legendGroup)
		}
	});
	aa.area = M;
	X.spline = x(W);
	F = ea(R, {
		type: "spline",
		getPointSpline: function(a, b, c) {
			var d = b.plotX,
				e = b.plotY,
				f = a[c - 1],
				g = a[c + 1],
				h, i, j, k;
			if (f && g) {
				a = f.plotY;
				j = g.plotX;
				var g = g.plotY,
					m;
				h = (1.5 * d + f.plotX) / 2.5;
				i = (1.5 * e + a) / 2.5;
				j = (1.5 * d + j) / 2.5;
				k = (1.5 * e + g) / 2.5;
				m = (k - i) * (j - d) / (j - h) + e - k;
				i += m;
				k += m;
				i > a && i > e ? (i = q(a, e), k = 2 * e - i) : i < a && i < e && (i = K(a, e), k = 2 * e - i);
				k > g && k > e ? (k = q(g, e), i = 2 * e - k) : k < g && k < e && (k = K(g, e), i = 2 * e - k);
				b.rightContX = j;
				b.rightContY = k
			}
			c ?
				(b = ["C", f.rightContX || f.plotX, f.rightContY || f.plotY, h || d, i || e, d, e], f.rightContX = f.rightContY = null) : b = ["M", d, e];
			return b
		}
	});
	aa.spline = F;
	X.areaspline = x(X.area);
	na = M.prototype;
	F = ea(F, {
		type: "areaspline",
		closedStacks: !0,
		getSegmentPath: na.getSegmentPath,
		closeSegment: na.closeSegment,
		drawGraph: na.drawGraph
	});
	aa.areaspline = F;
	X.column = x(W, {
		borderColor: "#FFFFFF",
		borderWidth: 1,
		borderRadius: 0,
		groupPadding: 0.2,
		marker: null,
		pointPadding: 0.1,
		minPointLength: 0,
		cropThreshold: 50,
		pointRange: null,
		states: {
			hover: {
				brightness: 0.1,
				shadow: !1
			},
			select: {
				color: "#C0C0C0",
				borderColor: "#000000",
				shadow: !1
			}
		},
		dataLabels: {
			align: null,
			verticalAlign: null,
			y: null
		},
		stickyTracking: !1,
		threshold: 0
	});
	F = ea(R, {
		type: "column",
		tooltipOutsidePlot: !0,
		requireSorting: !1,
		pointAttrToOptions: {
			stroke: "borderColor",
			"stroke-width": "borderWidth",
			fill: "color",
			r: "borderRadius"
		},
		trackerGroups: ["group", "dataLabelsGroup"],
		init: function() {
			R.prototype.init.apply(this, arguments);
			var a = this,
				b = a.chart;
			b.hasRendered && n(b.series, function(b) {
				if (b.type === a.type) b.isDirty = !0
			})
		},
		getColumnMetrics: function() {
			var a = this,
				b = a.chart,
				c = a.options,
				d = this.xAxis,
				e = d.reversed,
				f, g = {},
				h, i = 0;
			c.grouping === !1 ? i = 1 : n(b.series, function(b) {
				var c = b.options;
				if (b.type === a.type && b.visible && a.options.group === c.group) c.stacking ? (f = b.stackKey, g[f] === y && (g[f] = i++), h = g[f]) : c.grouping !== !1 && (h = i++), b.columnIndex = h
			});
			var b = K(Q(d.transA) * (d.ordinalSlope || c.pointRange || d.closestPointRange || 1), d.len),
				d = b * c.groupPadding,
				j = (b - 2 * d) / i,
				k = c.pointWidth,
				c = r(k) ? (j - k) / 2 : j * c.pointPadding,
				k = o(k, j - 2 * c);
			return a.columnMetrics = {
				width: k,
				offset: c + (d + ((e ? i - (a.columnIndex || 0) : a.columnIndex) || 0) * j - b / 2) * (e ? -1 : 1)
			}
		},
		translate: function() {
			var a = this,
				b = a.chart,
				c = a.options,
				d = c.stacking,
				e = c.borderWidth,
				f = a.yAxis,
				g = a.translatedThreshold = f.getThreshold(c.threshold),
				h = o(c.minPointLength, 5),
				c = a.getColumnMetrics(),
				i = c.width,
				j = ja(q(i, 1 + 2 * e)),
				k = c.offset;
			R.prototype.translate.apply(a);
			n(a.points, function(c) {
				var l = K(q(-999, c.plotY), f.len + 999),
					n = o(c.yBottom, g),
					s = c.plotX + k,
					t = ja(K(l, n)),
					l = ja(q(l, n) - t),
					r = f.stacks[(c.y < 0 ? "-" : "") + a.stackKey];
				d && a.visible &&
					r && r[c.x] && r[c.x].setOffset(k, j);
				Q(l) < h && h && (l = h, t = Q(t - g) > h ? n - h : g - (f.translate(c.y, 0, 1, 0, 1) <= g ? h : 0));
				c.barX = s;
				c.pointWidth = i;
				c.shapeType = "rect";
				c.shapeArgs = c = b.renderer.Element.prototype.crisp.call(0, e, s, t, j, l);
				e % 2 && (c.y -= 1, c.height += 1)
			})
		},
		getSymbol: ta,
		drawLegendSymbol: M.prototype.drawLegendSymbol,
		drawGraph: ta,
		drawPoints: function() {
			var a = this,
				b = a.options,
				c = a.chart.renderer,
				d;
			n(a.points, function(e) {
				var f = e.plotY,
					g = e.graphic;
				if (f !== y && !isNaN(f) && e.y !== null) d = e.shapeArgs, g ? (Ta(g), g.animate(x(d))) : e.graphic =
					c[e.shapeType](d).attr(e.pointAttr[e.selected ? "select" : ""]).add(a.group).shadow(b.shadow, null, b.stacking && !b.borderRadius);
				else if (g) e.graphic = g.destroy()
			})
		},
		drawTracker: function() {
			var a = this,
				b = a.chart.pointer,
				c = a.options.cursor,
				d = c && {
					cursor: c
				},
				e = function(b) {
					var c = b.target,
						d;
					for (a.onMouseOver(); c && !d;) d = c.point, c = c.parentNode;
					if (d !== y) d.onMouseOver(b)
				};
			n(a.points, function(a) {
				if (a.graphic) a.graphic.element.point = a;
				if (a.dataLabel) a.dataLabel.element.point = a
			});
			a._hasTracking ? a._hasTracking = !0 : n(a.trackerGroups,
				function(c) {
					if (a[c] && (a[c].addClass("highcharts-tracker").on("mouseover", e).on("mouseout", function(a) {
						b.onTrackerMouseOut(a)
					}).css(d), fb)) a[c].on("touchstart", e)
				})
		},
		alignDataLabel: function(a, b, c, d, e) {
			var f = this.chart,
				g = f.inverted,
				h = a.dlBox || a.shapeArgs,
				i = a.below || a.plotY > o(this.translatedThreshold, f.plotSizeY),
				j = o(c.inside, !!this.options.stacking);
			if (h && (d = x(h), g && (d = {
				x: f.plotWidth - d.y - d.height,
				y: f.plotHeight - d.x - d.width,
				width: d.height,
				height: d.width
			}), !j)) g ? (d.x += i ? 0 : d.width, d.width = 0) : (d.y += i ? d.height :
				0, d.height = 0);
			c.align = o(c.align, !g || j ? "center" : i ? "right" : "left");
			c.verticalAlign = o(c.verticalAlign, g || j ? "middle" : i ? "top" : "bottom");
			R.prototype.alignDataLabel.call(this, a, b, c, d, e)
		},
		animate: function(a) {
			var b = this.yAxis,
				c = this.options,
				d = this.chart.inverted,
				e = {};
			if (Z) a ? (e.scaleY = 0.001, a = K(b.pos + b.len, q(b.pos, b.toPixels(c.threshold))), d ? e.translateX = a - b.len : e.translateY = a, this.group.attr(e)) : (e.scaleY = 1, e[d ? "translateX" : "translateY"] = b.pos, this.group.animate(e, this.options.animation), this.animate = null)
		},
		remove: function() {
			var a = this,
				b = a.chart;
			b.hasRendered && n(b.series, function(b) {
				if (b.type === a.type) b.isDirty = !0
			});
			R.prototype.remove.apply(a, arguments)
		}
	});
	aa.column = F;
	X.bar = x(X.column);
	na = ea(F, {
		type: "bar",
		inverted: !0
	});
	aa.bar = na;
	X.scatter = x(W, {
		lineWidth: 0,
		tooltip: {
			headerFormat: '<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',
			pointFormat: "x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>",
			followPointer: !0
		},
		stickyTracking: !1
	});
	na = ea(R, {
		type: "scatter",
		sorted: !1,
		requireSorting: !1,
		noSharedTooltip: !0,
		trackerGroups: ["markerGroup"],
		drawTracker: F.prototype.drawTracker,
		setTooltipPoints: ta
	});
	aa.scatter = na;
	X.pie = x(W, {
		borderColor: "#FFFFFF",
		borderWidth: 1,
		center: [null, null],
		clip: !1,
		colorByPoint: !0,
		dataLabels: {
			distance: 30,
			enabled: !0,
			formatter: function() {
				return this.point.name
			}
		},
		ignoreHiddenPoint: !0,
		legendType: "point",
		marker: null,
		size: null,
		showInLegend: !1,
		slicedOffset: 10,
		states: {
			hover: {
				brightness: 0.1,
				shadow: !1
			}
		},
		stickyTracking: !1,
		tooltip: {
			followPointer: !0
		}
	});
	W = {
		type: "pie",
		isCartesian: !1,
		pointClass: ea(Na, {
			init: function() {
				Na.prototype.init.apply(this, arguments);
				var a = this,
					b;
				if (a.y < 0) a.y = null;
				v(a, {
					visible: a.visible !== !1,
					name: o(a.name, "Slice")
				});
				b = function() {
					a.slice()
				};
				J(a, "select", b);
				J(a, "unselect", b);
				return a
			},
			setVisible: function(a) {
				var b = this,
					c = b.series,
					d = c.chart,
					e;
				b.visible = b.options.visible = a = a === y ? !b.visible : a;
				c.options.data[la(b, c.data)] = b.options;
				e = a ? "show" : "hide";
				n(["graphic", "dataLabel", "connector", "shadowGroup"], function(a) {
					if (b[a]) b[a][e]()
				});
				b.legendItem && d.legend.colorizeItem(b,
					a);
				if (!c.isDirty && c.options.ignoreHiddenPoint) c.isDirty = !0, d.redraw()
			},
			slice: function(a, b, c) {
				var d = this.series;
				Ia(c, d.chart);
				o(b, !0);
				this.sliced = this.options.sliced = a = r(a) ? a : !this.sliced;
				d.options.data[la(this, d.data)] = this.options;
				a = a ? this.slicedTranslation : {
					translateX: 0,
					translateY: 0
				};
				this.graphic.animate(a);
				this.shadowGroup && this.shadowGroup.animate(a)
			}
		}),
		requireSorting: !1,
		noSharedTooltip: !0,
		trackerGroups: ["group", "dataLabelsGroup"],
		pointAttrToOptions: {
			stroke: "borderColor",
			"stroke-width": "borderWidth",
			fill: "color"
		},
		getColor: ta,
		animate: function(a) {
			var b = this,
				c = b.points,
				d = b.startAngleRad;
			if (!a) n(c, function(a) {
				var c = a.graphic,
					a = a.shapeArgs;
				c && (c.attr({
					r: b.center[3] / 2,
					start: d,
					end: d
				}), c.animate({
					r: a.r,
					start: a.start,
					end: a.end
				}, b.options.animation))
			}), b.animate = null
		},
		setData: function(a, b) {
			R.prototype.setData.call(this, a, !1);
			this.processData();
			this.generatePoints();
			o(b, !0) && this.chart.redraw()
		},
		getCenter: function() {
			var a = this.options,
				b = this.chart,
				c = 2 * (a.slicedOffset || 0),
				d, e = b.plotWidth - 2 * c,
				f = b.plotHeight -
				2 * c,
				b = a.center,
				a = [o(b[0], "50%"), o(b[1], "50%"), a.size || "100%", a.innerSize || 0],
				g = K(e, f),
				h;
			return La(a, function(a, b) {
				h = /%$/.test(a);
				d = b < 2 || b === 2 && h;
				return (h ? [e, f, g, g][b] * u(a) / 100 : a) + (d ? c : 0)
			})
		},
		translate: function(a) {
			this.generatePoints();
			var b = 0,
				c = 0,
				d = this.options,
				e = d.slicedOffset,
				f = e + d.borderWidth,
				g, h, i, j = this.startAngleRad = Ka / 180 * ((d.startAngle || 0) % 360 - 90),
				k = this.points,
				m = 2 * Ka,
				l = d.dataLabels.distance,
				n = d.ignoreHiddenPoint,
				o, q = k.length,
				r;
			if (!a) this.center = a = this.getCenter();
			this.getX = function(b, c) {
				i =
					I.asin((b - a[1]) / (a[2] / 2 + l));
				return a[0] + (c ? -1 : 1) * Y(i) * (a[2] / 2 + l)
			};
			for (o = 0; o < q; o++) r = k[o], b += n && !r.visible ? 0 : r.y;
			for (o = 0; o < q; o++) {
				r = k[o];
				d = b ? r.y / b : 0;
				g = t((j + c * m) * 1E3) / 1E3;
				if (!n || r.visible) c += d;
				h = t((j + c * m) * 1E3) / 1E3;
				r.shapeType = "arc";
				r.shapeArgs = {
					x: a[0],
					y: a[1],
					r: a[2] / 2,
					innerR: a[3] / 2,
					start: g,
					end: h
				};
				i = (h + g) / 2;
				i > 0.75 * m && (i -= 2 * Ka);
				r.slicedTranslation = {
					translateX: t(Y(i) * e),
					translateY: t(ca(i) * e)
				};
				g = Y(i) * a[2] / 2;
				h = ca(i) * a[2] / 2;
				r.tooltipPos = [a[0] + g * 0.7, a[1] + h * 0.7];
				r.half = i < m / 4 ? 0 : 1;
				r.angle = i;
				f = K(f, l / 2);
				r.labelPos = [a[0] + g + Y(i) * l, a[1] + h + ca(i) * l, a[0] + g + Y(i) * f, a[1] + h + ca(i) * f, a[0] + g, a[1] + h, l < 0 ? "center" : r.half ? "right" : "left", i];
				r.percentage = d * 100;
				r.total = b
			}
			this.setTooltipPoints()
		},
		drawGraph: null,
		drawPoints: function() {
			var a = this,
				b = a.chart.renderer,
				c, d, e = a.options.shadow,
				f, g;
			if (e && !a.shadowGroup) a.shadowGroup = b.g("shadow").add(a.group);
			n(a.points, function(h) {
				d = h.graphic;
				g = h.shapeArgs;
				f = h.shadowGroup;
				if (e && !f) f = h.shadowGroup = b.g("shadow").add(a.shadowGroup);
				c = h.sliced ? h.slicedTranslation : {
					translateX: 0,
					translateY: 0
				};
				f && f.attr(c);
				d ? d.animate(v(g, c)) : h.graphic = d = b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected ? "select" : ""]).attr({
					"stroke-linejoin": "round"
				}).attr(c).add(a.group).shadow(e, f);
				h.visible === !1 && h.setVisible(!1)
			})
		},
		drawDataLabels: function() {
			var a = this,
				b = a.data,
				c, d = a.chart,
				e = a.options.dataLabels,
				f = o(e.connectorPadding, 10),
				g = o(e.connectorWidth, 1),
				h = d.plotWidth,
				d = d.plotHeight,
				i, j, k = o(e.softConnector, !0),
				m = e.distance,
				l = a.center,
				p = l[2] / 2,
				s = l[1],
				r = m > 0,
				v, w, u, x, y = [
					[],
					[]
				],
				A, z, E, H, C, D = [0, 0, 0, 0],
				K = function(a, b) {
					return b.y - a.y
				},
				M = function(a, b) {
					a.sort(function(a, c) {
						return a.angle !== void 0 && (c.angle - a.angle) * b
					})
				};
			if (e.enabled || a._hasPointLabels) {
				R.prototype.drawDataLabels.apply(a);
				n(b, function(a) {
					a.dataLabel && y[a.half].push(a)
				});
				for (H = 0; !x && b[H];) x = b[H] && b[H].dataLabel && (b[H].dataLabel.getBBox().height || 21), H++;
				for (H = 2; H--;) {
					var b = [],
						L = [],
						I = y[H],
						J = I.length,
						F;
					M(I, H - 0.5);
					if (m > 0) {
						for (C = s - p - m; C <= s + p + m; C += x) b.push(C);
						w = b.length;
						if (J > w) {
							c = [].concat(I);
							c.sort(K);
							for (C = J; C--;) c[C].rank = C;
							for (C = J; C--;) I[C].rank >=
								w && I.splice(C, 1);
							J = I.length
						}
						for (C = 0; C < J; C++) {
							c = I[C];
							u = c.labelPos;
							c = 9999;
							var O, N;
							for (N = 0; N < w; N++) O = Q(b[N] - u[1]), O < c && (c = O, F = N);
							if (F < C && b[C] !== null) F = C;
							else
								for (w < J - C + F && b[C] !== null && (F = w - J + C); b[F] === null;) F++;
							L.push({
								i: F,
								y: b[F]
							});
							b[F] = null
						}
						L.sort(K)
					}
					for (C = 0; C < J; C++) {
						c = I[C];
						u = c.labelPos;
						v = c.dataLabel;
						E = c.visible === !1 ? "hidden" : "visible";
						c = u[1];
						if (m > 0) {
							if (w = L.pop(), F = w.i, z = w.y, c > z && b[F + 1] !== null || c < z && b[F - 1] !== null) z = c
						} else z = c;
						A = e.justify ? l[0] + (H ? -1 : 1) * (p + m) : a.getX(F === 0 || F === b.length - 1 ? c : z, H);
						v._attr = {
							visibility: E,
							align: u[6]
						};
						v._pos = {
							x: A + e.x + ({
								left: f,
								right: -f
							}[u[6]] || 0),
							y: z + e.y - 10
						};
						v.connX = A;
						v.connY = z;
						if (this.options.size === null) w = v.width, A - w < f ? D[3] = q(t(w - A + f), D[3]) : A + w > h - f && (D[1] = q(t(A + w - h + f), D[1])), z - x / 2 < 0 ? D[0] = q(t(-z + x / 2), D[0]) : z + x / 2 > d && (D[2] = q(t(z + x / 2 - d), D[2]))
					}
				}
				if (pa(D) === 0 || this.verifyDataLabelOverflow(D)) this.placeDataLabels(), r && g && n(this.points, function(b) {
					i = b.connector;
					u = b.labelPos;
					if ((v = b.dataLabel) && v._pos) E = v._attr.visibility, A = v.connX, z = v.connY, j = k ? ["M", A + (u[6] === "left" ? 5 : -5), z,
						"C", A, z, 2 * u[2] - u[4], 2 * u[3] - u[5], u[2], u[3], "L", u[4], u[5]
					] : ["M", A + (u[6] === "left" ? 5 : -5), z, "L", u[2], u[3], "L", u[4], u[5]], i ? (i.animate({
						d: j
					}), i.attr("visibility", E)) : b.connector = i = a.chart.renderer.path(j).attr({
						"stroke-width": g,
						stroke: e.connectorColor || b.color || "#606060",
						visibility: E
					}).add(a.group);
					else if (i) b.connector = i.destroy()
				})
			}
		},
		verifyDataLabelOverflow: function(a) {
			var b = this.center,
				c = this.options,
				d = c.center,
				e = c = c.minSize || 80,
				f;
			d[0] !== null ? e = q(b[2] - q(a[1], a[3]), c) : (e = q(b[2] - a[1] - a[3], c), b[0] += (a[3] -
				a[1]) / 2);
			d[1] !== null ? e = q(K(e, b[2] - q(a[0], a[2])), c) : (e = q(K(e, b[2] - a[0] - a[2]), c), b[1] += (a[0] - a[2]) / 2);
			e < b[2] ? (b[2] = e, this.translate(b), n(this.points, function(a) {
				if (a.dataLabel) a.dataLabel._pos = null
			}), this.drawDataLabels()) : f = !0;
			return f
		},
		placeDataLabels: function() {
			n(this.points, function(a) {
				var a = a.dataLabel,
					b;
				if (a)(b = a._pos) ? (a.attr(a._attr), a[a.moved ? "animate" : "attr"](b), a.moved = !0) : a && a.attr({
					y: -999
				})
			})
		},
		alignDataLabel: ta,
		drawTracker: F.prototype.drawTracker,
		drawLegendSymbol: M.prototype.drawLegendSymbol,
		getSymbol: ta
	};
	W = ea(R, W);
	aa.pie = W;
	v(Highcharts, {
		Axis: ab,
		Chart: tb,
		Color: ma,
		Legend: sb,
		Pointer: rb,
		Point: Na,
		Tick: Ja,
		Tooltip: qb,
		Renderer: Sa,
		Series: R,
		SVGElement: ra,
		SVGRenderer: Ca,
		arrayMin: Ga,
		arrayMax: pa,
		charts: Ba,
		dateFormat: Ua,
		format: wa,
		pathAnim: vb,
		getOptions: function() {
			return N
		},
		hasBidiBug: Sb,
		isTouchDevice: Mb,
		numberFormat: ua,
		seriesTypes: aa,
		setOptions: function(a) {
			N = x(N, a);
			Jb();
			return N
		},
		addEvent: J,
		removeEvent: ba,
		createElement: U,
		discardElement: Ra,
		css: L,
		each: n,
		extend: v,
		map: La,
		merge: x,
		pick: o,
		splat: ha,
		extendClass: ea,
		pInt: u,
		wrap: zb,
		svg: Z,
		canvas: $,
		vml: !Z && !$,
		product: "Highcharts",
		version: "3.0.2"
	})
})();